#go #testing #mocking
#Вперед #тестирование #издевательство
Вопрос:
Я использую пакет Go Mockery, и я хочу, чтобы функция Next
выполнила некоторые действия перед возвратом. Однако, когда я делаю это:
mockIter.On("Next", mock.AnythingOfType("*types.Query")).Return(func(q *types.Query) bool {
condition := (do something that returns a boolean)
return condition
})
Я получаю эту ошибку:
panic: interface conversion: interface {} is func(*types.Query) bool, not bool
Должно быть, я неправильно использую пакет, но похоже, что это правильно, потому что у них есть очень похожий пример в их документах:
Mock.On("passthrough", mock.AnythingOfType("context.Context"), mock.AnythingOfType("string")).Return(func(ctx context.Context, s string) string {
return s
})
Есть идеи о том, что я делаю неправильно?
Ответ №1:
Return
функция используется для возврата значений при вызове издевательской функции. Вы не можете изменить сигнатуру издеваемой функции.
Здесь вы возвращаете func(*types.Query) bool
(функция, которая возвращает логическое значение) вместо bool
, как указано в сообщении об ошибке.
Вы можете использовать функцию для выполнения некоторых вычислений, а затем возвращать значение. Вам просто нужно добавить ()
(или любые аргументы, которые принимает ваша функция) после определения функции, чтобы вызвать ее, и все будет готово.
Это работает:
mockIter.On("Next", mock.AnythingOfType("*types.Query")).Return(func() bool {
condition := (do something that returns a boolean)
return condition
}())
Но мне кажется, что вы хотите выполнить некоторые вычисления на основе аргумента, который передается при издевательском вызове. Я не думаю, что mockery поддерживает это на данный момент.