【问题标题】:Where do you store reusable mocks?你在哪里存储可重复使用的模拟?
【发布时间】:2017-03-11 17:33:39
【问题描述】:

您能否解释一下组织单元测试的正确方法是什么?例如,如果想模拟我的结构依赖项,我需要创建一个模拟依赖项来“实现”某些接口。

我应该在哪里创建这个模拟?它应该在同一个测试文件中创建吗?但是,如果我在另一个测试中需要它怎么办? Go 不允许在同一个包的 2 个不同文件中定义具有相同名称的结构(例如 UserServiceMock)。那么定义这个模拟结构的最佳位置是什么?

还有一个问题。我应该自己实现这种模拟还是有一些库/工具可以让我这样做?

【问题讨论】:

  • 为什么需要将相同的实现放在多个文件中?如果某些东西仅用于测试,请将其放在任何 _test.go 文件中。

标签: unit-testing testing go mocking


【解决方案1】:

我将我的 mock 存储在一个 mock 包中,以便我可以从不同的测试包中调用它们,并在我的测试中使用该包名称作为我正在模拟依赖项的指示。例如:

mock.UserService

您可以创建一个生成器或使用GoMock

【讨论】:

  • mock 是你应用程序的真实包吗?还是存储在 *_test.go 文件中?
  • 这是我在我的应用程序中创建的一个包
  • mock 导入user 包并且您在user 包中的user_test 导入mock 包时,这可能会由于循环依赖而导致编译错误。
【解决方案2】:

我也遇到了这个问题,我通过将接口的模拟及其声明放在一个单独的文件中来解决它。

mockery -dir=service  -all -inpkg

我使用 mockery 来生成它们,这将在同一个文件夹中创建 mock。根据上面的命令,它将为服务目录中存在的每个接口生成一个单独的文件。例如:mock_MyInterface.go

如果您不使用-inpkg 标志,它将在默认文件夹mocks 中创建模拟,但它不会在模拟实现中添加任何前缀,因此当您在单元测试中导入模拟包时会产生问题因为你会因为同名的模拟和原始实现而发生冲突。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2013-09-14
    • 2012-10-17
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多