造假者是我们在用Go构建软件时不能缺少的工具之一,特别是因为我们使用领域驱动设计来构建我们的企业系统,并且我们大量使用依赖注入来正确分离和测试各层。
我在之前的围棋工具文章中简单提到了counterfeiter ,这次我将深入探讨一下。
counterfeiter 在代码中使用 generate指令来自动生成你在代码中定义的依赖接口的Fakes/Doubles/Mocks。
比如说,假设你有以下代码。
type Writer interface {
Write() error
}
而你有一段这样的代码。
func WriteSomething(w Writer) bool {
if err := w.Write(); err != nil {
return false
}
return true
}
添加以下指令。
//go:generate counterfeiter -o fake/writer.gen.go -fake-name Writer . Writer
counterfeiter 将会生成一个新的类型 ,允许你将这些实例作为fake.Writer 假人使用,同时让你完全控制伪造、存根、模拟和监视上述实例。
在这个接口中使用这个简单的方法,生成的方法包括。
Write() error:满足接口的要求。WriteCallCount() int:确定该方法被调用了多少次。WriteCalls(func() error):定义一个返回与原始接口相同的方法,等同于w.WriteStub,但是goroutine-safe。WriteReturns(error): 返回所有调用Write的值,以及WriteReturnsOnCall(int, error):在特定的时间为特定的调用返回特定的值。
有了这些自动生成的方法,你就有足够的能力来正确测试你的外部依赖关系,以及它们如何影响你的内部流程。
counterfeiter 这是一个非常强大的工具。强烈推荐。