【问题标题】:How can I mock Go functions in my tests?如何在测试中模拟 Go 函数?
【发布时间】:2016-05-08 04:48:09
【问题描述】:

我在 StackOverflow 上阅读了一些问题,询问如何模拟 time.Now() 等函数。解决方案似乎是编写一个实现特定接口的结构,然后在测试中,改为传递该模拟。

有没有更好的方法来做到这一点?由于在 Golang 中没有足够好的依赖注入容器实现,我不想手动传递结构,或者创建一个内部只有这样的结构:

func (s MyStruct) Now() {
    return time.Now()
}

因为,首先,我无法测试 this 功能。当您处理其中没有变量的一行时,它可能什么都不是,但我有一个连接到 TCP 端口的函数。做这样的事情需要我为它使用的所有东西创建适配器(例如net.Dial()time.Now()io.Copy()bufio.Read() 等等)。

其次,由于没有 DI,我将不得不传递结构,这最终会使我的代码变得混乱,而不是像 DI 在其他语言中那样更容易阅读。

【问题讨论】:

标签: unit-testing go dependency-injection inversion-of-control


【解决方案1】:

除了使您能够轻松地模拟这些函数之外,为此类事物编写“适配器”(您自己的接口)还具有将您的代码从任何单独的实现中抽象出来的优势。

在您的代码中传递结构还可以使您的应用免受某种注入框架的外部依赖(其中许多只是违反了 IOC 原则)。

除了为这些依赖项编写自己的接口之外,某些设计理念还可以帮助您模拟。

例如,使用域驱动设计模式,您可以简单地在单元测试中模拟您的“存储库”,而不是模拟数据库库。

在 Go 中,所有这些最终都非常干净、简洁,没有大量第三方框架神奇地为您完成工作的负担。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多