导出Golang软件包进行测试?

时间:2018-10-12 14:40:11

标签: unit-testing go

在尝试对使用以下结构的代码进行测试时:

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
}

我偶然发现this Medium article声称您可以在测试代码中导出Golang软件包及其内部组件。不幸的是,我不确定它们的最终含义是什么:

  

export_test.go仅在我们运行go test时被包括在内,因此不会污染您的API,并且用户从不访问它们(不像java的@VisibleForTesting),并且它搭建了一个桥,允许未导出的桥可在math_test中访问

更糟糕的是,它的复制无法快速实现:

enter image description here

/ *在这里,context是包含我想完全访问* /

的结构的软件包

我基本上需要能够设置dbConnection中的DatabaseSt进行测试,而无需修改源代码。

1 个答案:

答案 0 :(得分:1)

添加以下名为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
     ...
}