Unit testing 如何在go的不同包中测试未报告的结构字段?

Unit testing 如何在go的不同包中测试未报告的结构字段?,unit-testing,testing,go,Unit Testing,Testing,Go,我有一个用工厂创建对象的包。结构具有未报告的字段,例如: package fetcher type GitFetcher struct { uri string } 我有另一个包,它解析一些配置文件,然后构建另一个使用上述对象的对象: package config type Source struct { fetcher GitFetcher } 我正在尝试测试我的config包。我想构建一些预期的对象,但由于我的测试在config中,而我的GitFetcher在

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

package fetcher
type GitFetcher struct {
    uri    string
}
我有另一个包,它解析一些配置文件,然后构建另一个使用上述对象的对象:

package config
type Source struct {
    fetcher    GitFetcher
}
我正在尝试测试我的
config
包。我想构建一些预期的对象,但由于我的测试在
config
中,而我的
GitFetcher
fetcher
中,我不能只创建我想要的对象,例如:

package config
expected := GitFetcher{
    uri: "example.com/repo.git"      // doesn't work. Field isn't exported.
}
如何跨包构建对象以进行这样的测试?我不想使用
fetcher
factory方法,因为它需要的参数并不简单

如何在go中测试未报告的[…]不同包

一点也不。可撤销的,不要尝试

(如果未报告的对象具有导出方法,则可以调用此方法。)

如何在go中测试未报告的[…]不同包

一点也不。可撤销的,不要尝试


(如果未报告的东西有一个导出方法,那么您可以调用此方法。)

没有直接的方法来实现这一点。您有多种选择来实现类似的目标,所有这些都有自己的权衡。这取决于你决定在你的情况下哪种权衡是最可接受的

一般来说,我会按以下顺序尝试:

  • 使包
    config
    依赖于接口,而不是
    GitFetcher
    struct。这样,您就可以在测试中模拟GitFetcher
  • 添加一个额外的工厂方法,专门用于可以更容易地构造
    GitFetcher
    的测试
  • 将未报告的字段导出
  • 简单地组合这些包。这样,您就可以访问测试中两个对象的未报告字段

  • 没有直接的方法来实现这一点。您有多种选择来实现类似的目标,所有这些都有自己的权衡。这取决于你决定在你的情况下哪种权衡是最可接受的

    一般来说,我会按以下顺序尝试:

  • 使包
    config
    依赖于接口,而不是
    GitFetcher
    struct。这样,您就可以在测试中模拟GitFetcher
  • 添加一个额外的工厂方法,专门用于可以更容易地构造
    GitFetcher
    的测试
  • 将未报告的字段导出
  • 简单地组合这些包。这样,您就可以访问测试中两个对象的未报告字段

  • @leafbebop Unexported并不意味着您不能拥有此类类型的实例。如果包a中的某个函数F给出了一个a.unexported方法M和thne,则可以执行u:=a.F();u、 M()。我以为您指的是OP指定的未报告字段。Nevermind.@leafbebop Unexported并不意味着您不能拥有此类类型的实例。如果包a中的某个函数F给出了一个a.unexported方法M和thne,则可以执行u:=a.F();u、 M()。我以为您指的是OP指定的未报告字段。没关系,因为不知道该怎么办而投了反对票。很好:-DDown投票支持不知道该怎么办。很好:-D