Unit testing 导出用于测试的Golang包?
在尝试针对使用以下结构的代码进行测试时:Unit testing 导出用于测试的Golang包?,unit-testing,go,Unit Testing,Go,在尝试针对使用以下结构的代码进行测试时: type DatabaseSt struct { DBName string DBConnectionStr string dbConnection *sql.DB InterpolateParams bool //Archived Databases MinFinancialYear int MaxFinancialYear int } //Database
type DatabaseSt struct {
DBName string
DBConnectionStr string
dbConnection *sql.DB
InterpolateParams bool
//Archived Databases
MinFinancialYear int
MaxFinancialYear int
}
//DatabaseContext The context to use if the use of a database is needed.
type DatabaseContext struct {
*Context
Database DatabaseSt
}
我偶然发现,您可以在测试代码中导出Golang包及其内部。不幸的是,我不知道他们最后的话是什么意思:
export_test.go只在我们运行go test时包含,所以它不会污染您的API,用户也不会访问它们(不像java的@VisibleForTesting),它构建了一个桥,让未报告的一个可以在math_test中访问
更糟糕的是,it的复制不会带来任何快速的结果:
/*这里,context
是包含我想要完全访问的结构的包*/
我基本上需要能够为测试设置
DatabaseSt
的dbConnection
,而无需修改源代码 添加名为export_test.go的以下文件:
package context
func SetDbConnection(DatabaseSt *ds, db *sql.DB) {
ds.dbConnection = db
}
从同一目录中的其他测试文件中使用它,如下所示:
package context_test
import "context"
func FooTest(t *testing.T) {
...
context.SetDbConnection(ds, db)
...
}
或者,在上下文包中编写测试,以便您能够完全访问成员:
package context
func FooTest(t *testing.T) {
...
ds.dbConnection = db
...
}
我认为您可以创建一个名为“packagename_test”的测试文件来实现这一点,但我不确定
var ContextPkg=context
对我来说没有意义。。。你已经读过了吗?那篇文章讨论的是在同一个包中使用不同的包标识符进行“黑盒”测试。我不明白,如果您需要导出额外的部件来进行测试,那么通过外部包名进行测试的意义何在。几乎所有的代码都在同一个包中测试。我尝试了类似的方法,但是通过扩展数据库ST
,使用一个名为DatabaseStub
的对象,该对象包含用于断言期望的模拟(不仅仅是存根数据库连接),并在一个名为stubDBContext\u test.go
的文件中。令我恐惧的是,我在那里写的函数找不到。我从使用代码的测试中得到了这些错误:未定义:“ezsoft/apiserver_sdk/context”。NewDBStub
解释“扩展”的含义。这个答案中的技巧只在与包相同的目录中起作用。您正在尝试从其他程序包访问此文件吗?是。整个SUT中都有使用context.DatabaseContext
的代码。“扩展”是指创建一个存根对象,该存根对象具有DatabaseContext
参数所需的context.DatabaseSt
(还有其他字段,如Mock
,用于存储所提供的dbConnection
上的期望值)。