使用testify模拟接口方法两次具有不同的输入和输出



如何在 golang 测试中模拟接口方法两次?例如:

type myCache interface{
Get(key string, data interface{}) error
}
type service struct {
cache myCache
}
func (s service) GetBookDetail() (BookDetail, error) {
...
book := Book{}
err := s.cache.Get("book", &book)
if err != nil {
return BookDetail{}, err
}
...
author := Author{}
err := s.cache.Get("author", &author)
if err != nil {
return BookDetail{}, err
}
...
}

当我测试func GetBookDetail()时,我怎样才能模拟两次Get(key string, data interface{}) error?我尝试这样做,但它失败了:

func TestGetBookDetail(t *testing.T) {
...
mockCache.On("Get",
mock.MatchedBy(func(key string) bool {
return key == "book"
}), mock.MatchedBy(func(data interface{}) bool {
return data == &Book{}
})).Return(nil)
mockCache.On("Get",
mock.MatchedBy(func(key string) bool {
return key == "author"
}), mock.MatchedBy(func(data interface{}) bool {
return data == &Author{}
})).Return(nil)
...
out, err := mockService.GetBookDetail()
...
}

在测试中出现这样的错误:

差异:

0:PASS:(字符串=书(匹配函数(字符串(布尔值

1: 失败: (*Book=&{ }( 与 func(( bool 不匹配 [已恢复]

恐慌:

注意:我使用github.com/stretchr/testify

首先,回答您的问题:是的,您可以指定要返回一个值与另一个值的次数。您可以通过使用Once()Twice()Times(n)来执行此操作,如下所示:

m.On("foo", ...).Return(...).Once()

此外,在测试结束时,您应该通过执行m.AssertExpectations(t)来确认这些方法被调用了正确的次数。

现在,我的建议是:你似乎把你的模拟过于复杂了。仅当您希望检查部分相等或在检查相等性之前进行一些处理时,才需要使用mock.MatchedBy。在您的情况下,m.On("Get", "book", &Book{})...应该可以正常工作。

此外,由于您对模拟函数有不同的"输入" - 您不一定需要在末尾添加Once()。仅当您想要返回不同的值但参数保持不变时,它才成为必需的。但是,断言函数是否按预期次数调用通常是一种很好的做法。

相关内容

  • 没有找到相关文章