Функция имитации без приемника

У меня есть файл util.go:

func Foo(service *SomeService) error {
    return helper(service)
}

func helper(service *SomeService) error {
    ...
}

Я пишу модульные тесты, используя testify, начиная с Foo. Я хочу:

  1. издеваться helper
  2. утверждать, высмеянный helper вызвали 1 раз

Я видел несколько многообещающих решений на /questions/6872908/maketnyie-funktsii-v-go/6872919#6872919, но не уверен в них:

Метод 1: передать помощника в качестве параметра Foo. Мое сомнение: testify нужна структура Mock для AssertNumberOfCalls, а здесь структуры нет.

Метод 2: создать структуру для Foo. Мое сомнение: я не знаю, имеет ли смысл создавать структуру для utils. Также требует дополнительного рефакторинга, так как вызывающиеFoo потребуется структура utils.

Как лучше всего это сделать?

1 ответ

Если вы просто хотите проверить вызываемые аргументы helper, это подход, который я использовал. Этот же тест также докажет, что вашему помощнику звонили ровно один раз.

    // Code

    var originalFn = func(arg1, arg2 string) {
        ...
    }


    func Foo() {
        originalFn(arg1,arg2)
    }

    // Tests

    func TestFoo(t *testing.T) {
        tempFn := originalFn
        var fnArgs []string
        originalFn = func(arg1, arg2) {
            fnArgs = append(fnArgs, []string{arg1, arg2})
        }
        defer originalFn = tempFn

        tests := []struct{
            expected []string
        }{
            {
                expected: []string{"arg1", "arg2"},
            },
        }

        for _, tt:= range tests {
            fnArgs := make([]string, 0)
            Foo()
            assert.Equal(t, tt.expected, fnArgs)
        }
    }
Другие вопросы по тегам