我正在尝试重构一些测试代码,在两个包中我需要做同样的事情(连接到数据库)。我遇到了一个导入循环的问题。我明白为什么不能这样做,但想知道最好的解决方法是什么。
具体来说,我有三个包:testutils
、client
和engine
。
在engine
中,我定义了一个接口和一个实现(都是已导出的)。
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_test.go
上的导出方法,并在client/client_test.go
中使用它。但没有成功。:/我感觉我在其他语言中也做过这件事,但可能是我自己疯了。如何为可重用性构建此代码的最佳方式?