Как вернуть корректный результат при тестировании анонимных функций в 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 - на текущий момент не попробовал, но подозреваю, что будет так же, как и в варианте выше

Ответы (0 шт):