golang中的导入循环与测试包

时间:2016-08-18 22:10:18

标签: testing go

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

一些细节,我有三个包:testutilsclientengine

在引擎中我定义了一个界面&实施(均已导出)。

package engine
type interface QueryEngine {
  // ...
}
type struct MagicEngine {
  // ...
}

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

package testutils
func CreateAndConnect() (*engine.MagicEngine, error) {
  // ....
}

现在在测试代码中(使用TestMain)我需要执行类似

的操作
package engine
func TestMain(m *testing.M) {
  e, err := testutils.CreateAndConnect()
  // ....
  os.Exit(m.Run())
}

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

我尝试将其作为导出方法添加到engine测试类(engine/engine_test.go)并在client/client_test.go中使用它。没有骰子。 :/

我觉得我用其他语言做过这个,但可能很疯狂。构造此代码以实现可重用性的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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