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
上的期望值)。