我目前遇到了构建应用程序结构及其测试基础架构的问题。
以下是布局的简要概述
<GOROOT>/src/myapp/controllers/
<GOROOT>/src/myapp/controllers/account.go
...
<GOROOT>/src/myapp/models/
<GOROOT>/src/myapp/models/account.go
<GOROOT>/src/myapp/models/account_test.go
...
<GOROOT>/src/myapp/components/
<GOROOT>/src/myapp/components/comp1/
<GOROOT>/src/myapp/components/comp1/impl.go
<GOROOT>/src/myapp/components/comp1/impl_test.go
<GOROOT>/src/myapp/components/
...
<GOROOT>/src/myapp/testutil/
<GOROOT>/src/myapp/testutil/database.go
<GOROOT>/src/myapp/testutil/models.go
...
问题1
文件myapp/testutil/models.go
包含models/*_test.go
测试中使用的一些util函数。
util函数实际上使用包myapp/models
数据结构和函数。因此,我们有一个导入周期:account_test.go
导入testutil
包,后者又导入models
。
这里唯一明确的解决方案是将testutil/models.go
保留在models
包内的同一个包test_utils.go
,这对我来说似乎有些笨拙。在这种情况下,最好的解决办法是什么?
问题2
testutil
包有一些comp1
的初始化(假设它是第三方服务的客户端)。当我们运行测试comp1/impl_test.go
时,导入testutil
包,并导入comp1
包,因为它负责组件的初始化。相同的循环导入地狱。将初始化移动到测试用例中的每个位置似乎是代码的重复。仍然在寻找一些优雅的解决方案...
答案 0 :(得分:8)
问题1
如果package testutils
只提供package module
的测试期间使用的实用程序函数,那么只需将这些函数放入models/testutils_test.go
:现在运行时将包含这些实用程序函数models/*_test.go
测试。没有进口周期了。
这是你“唯一明确的解决方案”,我看不到任何“笨拙”的东西。
问题2
导入周期:与上述相同。
初始化:您的comp1/impl_test.go
可以提供func init()
,因此无需重复代码。
(标准库是如何测试不同内容的良好来源。测试代码中的IMHO代码重复不是七种致命罪之一。)