Как вернуть корректный результат при тестировании анонимных функций в golang с помощью testify/mocks .Return()
Есть метод, который тестирую
func (o Object) SomeDo(ctx context.Context, id int64) (int64, err) {
var obj int64
err := o.tn.End(func() error {
var err error
obj, err = o.innerDo(ctx, id)
if err != nil {
return err
}
return nil
}())
}
Где o.tn.End() принимает анонимную функцию
Есть метод, которую вызывается внутри анонимной функции
func (o Object) innerDo(ctx context.Context, id int64) (int64, err) {
// do something
return 1, nil
}
Для тестов использую testify/mocks
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
Моки сгенерированны с помощью mockery
При тесте мокаю End() таким вот способом
tn.On("End", mock.AnythingOfType("func() error")).
Run(func(args mock.Arguments) {
errIn = args.Get(0).(func() error)()
}).
Return(nil)
objId, err := o.SomeDo(ctx, int64())
require.NoError(t, errIn)
require.NoError(t, err)
require.Equal(t, int64(1), objId)
Проблема в том, что внутр-ю ошибку приходится проверять отдельно, так как возвращаемое значение в return не динамическое и остается таким же, каким было на момент компиляции
Варианты
- Обернуть ошибку в тип и реализовать интерфейс Error, прокинуть ссылку в return - помогает только когда ошибка не nil
- Создать тип обёртку над стадартным и реализовать у него интерфейс Error, прокинуть ссылку в return - на текущий момент не попробовал, но подозреваю, что будет так же, как и в варианте выше