• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

unit-testing - Go 中的模拟接收器功能

[复制链接]
菜鸟教程小白 发表于 2022-8-16 02:59:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试对调用该结构中的其他接收器函数的接收器函数进行单元测试。

假设我想测试 Three() 并在下面模拟对 two() 的调用:

type MyStruct struct {
    a string
    b string
}

func (m *MyStruct) one() int {
    return 2
}

func (m *MyStruct) two() int {
    return m.one() * 2
}

func (m *MyStruct) Three() int {
    return m.two() * 2
}

我正在遵循以下方法二 answer .

我为每个想要单元测试的函数创建了一个自定义构造函数,并使用模拟版本覆盖这些方法。但我认为一旦函数数量增加,维护代码可能并不容易。

是否有任何首选方式来模拟此类功能?我希望官方文档有一些关于如何在不同场景中模拟事物的指南,类似于 Python 上的 mox 提供的内容。

另外,请注意,我不想使用第三方模拟库。



Best Answer-推荐答案


这是一种非常不习惯的方式来测试你的东西。
其他语言可能需要所有这些模拟,但是
请不要在 Go 中这样做。

在您提供的示例中测试代码的自然方式
将是:1) 为 MyStruct.one 编写表驱动测试
并确保您测试所有情况。现在你知道了 one工作得很好 2) 对 MyStruct.two 做同样的事情.
请注意,测试未导出的内容是可能的、有用的并且
在 Go 中很常见。现在不再需要模拟
一些方法,只是 3) 写一些表驱动的测试MyStruct.Three并检查它是否有效。

但也许你的方法 onetwo做更高级的东西,并且
访问环境(文件系统、数据库、网络)和
你不想要你的 Three 测试依赖那个?
所以重构你的代码!也许 Three不应该是一种方法
MyStruct但是一个接受 interface OneAndTwoer 的函数
作为参数,您的生产代码调用 Three与“真实”
MyStructs 而您的测试代码使用 InMemoryMyStrcuts 调用它
哪个不依赖于环境?你可以称之为
模拟,我称之为接口(interface)的不同实现。

在您的示例中,提供建议很简单:使用表驱动
测试 one , twoThree不要 mock 。
对于更现实的问题,建议可能会有所不同,但
在不了解情况的情况下很难给出一般性建议
情况。最好的一般建议是:查看测试
标准库,您几乎可以在其中找到有用的模式
每个测试场景。

关于unit-testing - Go 中的模拟接收器功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29246249/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap