【发布时间】:2023-04-05 03:05:01
【问题描述】:
假设我有两个包,foo 和 bar(因此,foo.go、foo_test.go、bar.go 和 bar_test.go。)bar 取决于 foo。在bar_test.go 中,我想使用一些在foo_test.go 中定义的伪造类型。但由于不允许*_test.go 文件导出类型,我将它们移到foo 的测试包中,即footest,foo 和bar 都依赖于它。
假设foo.go 有一些这样的接口:
type A interface {
AFunc() err
}
type B interface {
BFunc() (A, error)
}
在footest.go,我想用假货实现这些接口:
type FakeA struct {}
type FakeB struct {}
func (fa *FakeA) AFunc() error {
// this does something
}
func (fb *FakeB) BFunc() (A, error) {
// this does something and returns an instance of A
}
这不起作用,因为它创建了循环依赖。 foo 依赖于footest,但footest 也需要依赖于foo 才能引用A。
我是否错过了某种可以避免这个问题的最佳实践?我的印象是,当测试文件需要在其他包中使用伪造类型时,创建测试包(如 footest)是标准做法,但如果有更好的方法,我希望得到纠正。
【问题讨论】: