4 回答
TA贡献1801条经验 获得超8个赞
绝对可以用未导出的字段测试结构。
它很笨拙,但你可以使用fmt.Sprint().
func isExpectedStruct(myStruct *otherPak.MyStruct) bool {
expectedStr := "&{1 2}"
str := fmt.Sprint(myStruct)
return expectedStr == str
}
或者
如果你只想测试一个特定的领域
func isExpectedField(myStruct *otherPak.MyStruct) bool {
expectedSubStr := "unexportedField:2"
str := fmt.Sprintf("%+v", myStruct)
return strings.Contains(str, expectedSubStr)
}
但仅仅因为你可以并不意味着你应该。
我认为在大多数情况下,将字段更改为导出或使用模拟会更好,但如果由于某种原因这些不是选项,这会为您提供另一种选择。
TA贡献1830条经验 获得超3个赞
如果您没有太多需要测试的属性,那么一种(hacky?)方法是为该属性创建一个 getter 函数。
例如,在包中创建这样的东西:
func (g *gitFetcher) GetUri() string {
return g.uri
}
在你的模拟中,你可以拥有
type GitFetcherMock struct {
mock.Mock
}
func (g *GitFetcherMock) GetUri() string {
args := g.Called()
return args.Get(0)
}
并且您可以在实际代码中使用实际 URI 的任何地方传入 GetUri()。
TA贡献1815条经验 获得超10个赞
没有直接的方法可以实现这一点。您有多种选择来实现类似的目标,所有这些都有自己的权衡。由您决定哪种权衡最适合您的情况。
一般来说,我会按以下顺序尝试:
使包
config
依赖于接口而不是结构GitFetcher
。这样你就可以GitFetcher
在你的测试中模拟。添加一个额外的工厂方法,专门用于可以
GitFetcher
更容易构建的测试。将未导出的字段导出。
简单地组合包。这样您就可以访问测试中两个对象的未导出字段。
- 4 回答
- 0 关注
- 102 浏览
添加回答
举报