【问题标题】:Exporting Golang packages for testing?导出 Golang 包进行测试?
【发布时间】:2019-03-17 19:48:28
【问题描述】:

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

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 中访问

更糟糕的是,复制它会导致无处可去:

/* 这里,context 是包含我想要完全访问的结构的包 */

我基本上需要能够设置那个DatabaseStdbConnection进行测试,而不需要修改源代码。

【问题讨论】:

  • 我认为你可以创建一个包名为“packagename_test”的测试文件来实现这一点,但我不确定
  • var ContextPkg = context 对我来说没有意义...你读过golang.org/pkg/testinggolang.org/cmd/go/#hdr-Test_packages 了吗?
  • 那篇文章谈论的是在同一个包中使用不同的包标识符进行“黑盒”测试。如果您需要导出额外的部分来执行此操作,我不明白通过外部包名称进行测试的意义何在。几乎所有代码都在同一个包中进行测试。

标签: unit-testing go


【解决方案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
     ...
}

【讨论】:

  • 我尝试了类似的方法,但是通过扩展 DatabaseSt,使用一个名为 DatabaseStub 的对象,其中包含用于断言期望的模拟(不仅仅是存根数据库连接),并在一个文件中命名为stubDBContext_test.go。令我恐惧的是,找不到我在那里编写的函数。我从使用代码的测试中得到了这些错误:undefined: "ezsoft/apiserver_sdk/context".NewDBStub
  • 解释你所说的“扩展”是什么意思。此答案中的技巧仅适用于与包相同的目录。您是否尝试从另一个包中访问它?
  • 是的。整个 SUT 中都有使用 context.DatabaseContext 的代码。通过“扩展”,我的意思是创建一个 具有 所需的 context.DatabaseSt 的存根对象,这是 DatabaseContext 参数所需的(还有其他字段,例如 Mock,用于存储对提供的 @987654332 的期望@)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
相关资源
最近更新 更多