如何在不同的包中测试未导出的struct字段?

时间:2018-08-20 12:37:22

标签: unit-testing testing go

我有一个用工厂创建对象的包。这些结构具有未导出的字段,例如:

package fetcher
type GitFetcher struct {
    uri    string
}

我还有另一个程序包,该程序包解析一些配置文件,然后构建另一个使用上述对象的对象:

package config
type Source struct {
    fetcher    GitFetcher
}

我正在尝试测试我的config软件包。我想构建一些预期的对象,但是由于我的测试在config中,而我的GitFetcherfetcher中,所以我不能只创建所需的对象,例如:

package config
expected := GitFetcher{
    uri: "example.com/repo.git"      // doesn't work. Field isn't exported.
}

我如何跨包构建对象以进行这样的测试?我不想使用fetcher工厂方法,因为它采用的参数并不直接。

2 个答案:

答案 0 :(得分:2)

  

如何在go中测试未导出的其他软件包?

一点也不。不可,请勿尝试。

(如果未导出的事物具有导出的方法,则可以调用此方法。)

答案 1 :(得分:0)

没有直接的方法可以实现这一目标。您可以有多种选择来实现相似的目标,但都需要权衡取舍。由您决定哪种折衷方案最适合您。

通常,我会按以下顺序尝试它们:

  1. 使程序包config依赖于接口而不是GitFetcher结构。这样,您就可以在测试中模拟GitFetcher
  2. 添加另外一个工厂方法,专门用于可以更轻松地构造GitFetcher的测试。
  3. 将未导出的字段导出。
  4. 简单地组合包装。这样,您可以在测试中访问两个对象的未导出字段。