Функция имитации без приемника
У меня есть файл util.go
:
func Foo(service *SomeService) error {
return helper(service)
}
func helper(service *SomeService) error {
...
}
Я пишу модульные тесты, используя testify
, начиная с Foo
. Я хочу:
- издеваться
helper
- утверждать, высмеянный
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)
}
}