我正在尝试重构一些测试代码,在两个包中我需要做同样的事情(连接到数据库)。我正在进入一个进口周期。我知道为什么我不能这样做,但我想知道最好的方法是什么。
一些细节,我有三个包:testutils
,client
,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/engine_test.go
)并在client/client_test.go
中使用它。没有骰子。 :/
我觉得我用其他语言做过这个,但可能很疯狂。构造此代码以实现可重用性的最佳方法是什么?
答案 0 :(得分:0)
您可以使用黑盒式测试,因为导出的组件已导出。将测试更改为包engine_test:
package engine_test
import "engine"
import "testutils"
func TestMain(m *testing.M) {
e, err := testutils.CreateAndConnect()
// ....
os.Exit(m.Run())
}