Как вы реализуете конкретное поведение для функции издевательства

#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 поддерживает это на данный момент.