unit-testing - 如何对 Go 中结构体的特定方法执行单元测试

标签 unit-testing go

假设我有一个结构 Car它有一些我想测试的方法。例如IgniteEngine , SwitchGear ,和drive 。正如你所看到的drive取决于其他方法。我需要一种方法来模拟 IgniteEngineSwitchGear

我认为我应该使用界面,但我不太明白如何实现它。

假设Car现在是一个接口(interface)

type Car interface {
    IgniteEngine()
    SwitchGear()
    Drive()
}

我可以创建一个MockCarIgniteEngine 的两个模拟函数和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/

相关文章:

ruby-on-rails - Rails 3 测试框架困惑

go - 正确的 Go 类型传递给 C 函数?

go - 当 init() 函数之间存在依赖关系时,如何将包拆分为多个文件?

go - 如何避免来自golang的 "passphrase is too short"

jquery - Go 和 Typeahead js 集成

c# - Pex(及其输出)是否适合企业环境?

ruby-on-rails - RSpec 失败(未定义方法 `id' 为 nil :NilClass ) with has_many through model

java - 测试我的 Maven 库与 Android 的兼容性

python - 用 moto 模拟 lambda 响应

json - 嵌入式结构的多态 JSON 解码