我正在尝试重构一些测试代码,并且在两个包中我需要做同样的事情(连接到数据库)。我正在获取一个导入周期。我明白为什么我不能这样做,但我想知道最好的解决方法是什么。
一些细节,我有三个包:testutils
、client
、engine
。
在引擎中,我定义了一个接口(interface)和实现(均已导出)。
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 中使用它
。没有骰子。 :/
我觉得我已经用其他语言做到了,但可能很疯狂。构建此代码以实现可重用性的最佳方式是什么?
最佳答案
您可以使用黑盒样式测试,因为引擎的组件是导出的。将您的测试更改为在包 engine_test 中:
package engine_test
import "engine"
import "testutils"
func TestMain(m *testing.M) {
e, err := testutils.CreateAndConnect()
// ....
os.Exit(m.Run())
}
关于testing - 使用测试包在 golang 中导入周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39028261/