假设我有一个结构 Car
它有一些我想测试的方法。例如IgniteEngine
, SwitchGear
,和drive
。正如你所看到的drive
取决于其他方法。我需要一种方法来模拟 IgniteEngine
和SwitchGear
。
我认为我应该使用界面,但我不太明白如何实现它。
假设Car
现在是一个接口(interface)
type Car interface {
IgniteEngine()
SwitchGear()
Drive()
}
我可以创建一个MockCar
和 IgniteEngine
的两个模拟函数和SwitchGear
但现在我如何测试 Drive
的源代码?
我是否将源代码复制并粘贴到模拟对象中?这看起来很愚蠢。我对于如何进行模拟的想法是否错误?模拟仅在我进行依赖注入(inject)时才起作用吗?
现在如果 Drive
会怎么样?实际上依赖于外部库,例如数据库或消息代理系统?
谢谢
最佳答案
我认为问题不在于接口(interface)本身,而在于Car
的实现方式。好的可测试代码有利于组合,所以如果你有类似的东西:
type Engine interface {
Ignite()
}
type Clutch interface {
SwitchGear()
}
然后你就可以拥有这样的汽车:
type Car struct {
engine Engine
clutch Clutch
}
func (c *Car) IgniteEngine() {
c.engine.Ignite()
}
...
通过这种方式,您可以替换 Car
中的发动机和离合器,并创建模拟离合器和发动机,以准确产生测试 Drive
方法所需的行为。
关于unit-testing - 如何对 Go 中结构体的特定方法执行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738428/