【问题标题】:Golang test package circular dependency problemGolang测试包循环依赖问题
【发布时间】:2023-04-05 03:05:01
【问题描述】:

假设我有两个包,foobar(因此,foo.gofoo_test.gobar.gobar_test.go。)bar 取决于 foo。在bar_test.go 中,我想使用一些在foo_test.go 中定义的伪造类型。但由于不允许*_test.go 文件导出类型,我将它们移到foo 的测试包中,即footestfoobar 都依赖于它。

假设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)是标准做法,但如果有更好的方法,我希望得到纠正。

【问题讨论】:

    标签: go testing


    【解决方案1】:

    只要您在 foo_test.go 文件中使用 package foo_test,包 foo 就不会依赖于包 footest。在这种情况下, foo_test 将被编译为一个单独的包。但是,您将无法访问 package foo 中的非导出类型。

    例如

    foo.go

    package foo
    
    type A interface {
       AFunc() err
    }
    
    type B interface {
       BFunc() (A, error)
    }
    

    foo_test.go

    package foo_test
    
    // Add tests after importing package footest and foo
    

    Read this answer 了解有关包命名的更多详细信息。

    【讨论】:

    • 我没有意识到将测试代码放在与被测代码不同的包中是最佳实践。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多