带有测试包的 golang 导入周期

ryb*_*bit 5 testing go

我正在尝试重构一些测试代码,并且在两个包中我需要做同样的事情(连接到数据库)。我正在进入一个导入周期。我明白为什么我不能这样做,但我想知道最好的解决办法是什么。

具体来说,我有三个包:testutilsclientengine

在引擎中,我定义了一个接口和实现(均导出)。

package engine
type interface QueryEngine {
  // ...
}
type struct MagicEngine {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

然后在testutils包中我将创建一个MagicEngine并尝试返回它。

package testutils
func CreateAndConnect() (*engine.MagicEngine, error) {
  // ....
}
Run Code Online (Sandbox Code Playgroud)

现在在测试代码中(使用TestMain)我需要做类似的事情

package engine
func TestMain(m *testing.M) {
  e, err := testutils.CreateAndConnect()
  // ....
  os.Exit(m.Run())
}
Run Code Online (Sandbox Code Playgroud)

这当然是一个循环。我想这样做,以便我可以在client包中也使用这个testutils.CreateAndConnect()方法。我不想重复两个包中的代码。我不希望它出现在engine包的主代码中,它对于测试来说非常具体。

engine我尝试将其添加为测试类 ( )上的导出方法engine/engine_test.go,并在client/client_test.go. 没有骰子。:/

我觉得我已经用其他语言做到了这一点,但可能很疯狂。构建此代码以实现可重用性的最佳方法是什么?

Jam*_*erd 4

您可以使用黑盒式测试,因为引擎的组件是导出的。将您的测试更改为包 engine_test 中:

package engine_test
import "engine"
import "testutils"
func TestMain(m *testing.M) {
  e, err := testutils.CreateAndConnect()
  // ....
  os.Exit(m.Run())
}
Run Code Online (Sandbox Code Playgroud)