AssertCalled всегда терпит неудачу с библиотекой свидетельства
Я использую testify для проверки своего кода и хочу проверить, была ли вызвана функция.
Я делаю следующее:
type Foo struct {
mock.Mock
}
func (m Foo) Bar() {
}
func TestFoo(t *testing.T) {
m := Foo{}
m.Bar()
m.AssertCalled(t, "Bar")
}
Ошибка, которую я получаю:
Error: Should be true
Messages: The "Bar" method should have been called with 0 argument(s), but was not.
mock.go:419: []
Я вызываю функцию "Bar" и сразу спрашиваю, была ли она вызвана, но она возвращает false. Что я делаю неправильно? Как правильно проверить, была ли вызвана функция с помощью testify?
4 ответа
Я попробовал с этим и работает:
type Foo struct {
mock.Mock
}
func (m *Foo) Bar() {
m.Called()
}
func TestFoo(t *testing.T) {
m := &Foo{}
m.On("Bar").Return(nil)
m.Bar()
m.AssertCalled(t, "Bar")
}
Как заявил Крис Дрю, вы должны использовать указатель получателя при объявлении метода Bar.
Кроме того, вам нужно определить новую структуру как указатель и смоделировать метод для возврата значения.
Глядя на документацию свидетельств, я думаю, что вы должны явно позвонить func (*Mock) Called
сообщить фиктивному объекту, что метод был вызван.
func (m *Foo) Bar() {
m.Called()
}
Есть несколько примеров в тестах на свидетельство.
Убедитесь, что это приемник указателя, а НЕ приемник значения.
Это всегда будет иметь нулевые вызовы
type Foo struct {
mock.Mock
}
func (m Foo) Bar()
m.Called()
}
Это будет иметь N количество вызовов
type Foo struct {
mock.Mock
}
func (m *Foo) Bar()
m.Called()
}
В качестве дополнительного решения, когда вы хотите/нужно использовать приемник значений, хотя и не так чисто, у меня сработало указание Mock в качестве поля указателя.
type Foo struct {
m *mock.Mock
}
func (f Foo) Bar() {
f.m.Called()
}
func TestFoo(t *testing.T) {
f := Foo{m: &mock.Mock{}}
f.Bar()
f.m.AssertCalled(t, "Bar")
}