登录
首页 >  Golang >  Go问答

使用 testify 框架模拟两次接口方法调用,分别测试输入和输出的不同情况

来源:stackoverflow

时间:2024-03-03 15:36:25 492浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《使用 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: (string=book) 与 func(string) bool 匹配 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() 。仅当您想要返回不同的值但参数保持不变时,它才变得强制。然而,断言该函数是否被调用了预期的次数是一个很好的做法。

本篇关于《使用 testify 框架模拟两次接口方法调用,分别测试输入和输出的不同情况》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>