为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕尼黑的夜晚无繁华 2022-06-06 17:42:58
如何在 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: (string=book) 由 func(string) bool 匹配1: FAIL: (*Book=&{ }) 不匹配 func() bool [恢复]恐慌:注意:我使用github.com/stretchr/testify
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

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

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

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

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

此外,由于您对模拟函数有不同的“输入” - 您不一定需要Once()在最后添加。仅当您想要返回不同的值但参数保持不变时,它才成为强制性的。但是,断言该函数是否被调用了预期的次数通常是一个好习惯。


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信