去:测试内部功能

oop*_*ode 3 testing internal go

假设我在包中有一个MyType带私有方法的类型.我还有一个目录,我想在那里存储我的包的测试.这是看起来像:(mt *MyType) private()mypackageteststests/mypackage_test.go

package mypackage_test

import (
    "testing"
    "myproj/mypackage"
)

func TestPrivate(t *testing.T) {
    // Some test code
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行时,go test我得到了cannot refer to unexported field or method my package.(*MyType)."".private)错误.我已经google了一下,发现从小写开始的函数不能在他们自己的包之外看到(这似乎是真的,因为大写函数可以从测试中自由调用).

我还读到了某个地方,添加<...>_internal_test.go到测试文件可以解决我的问题,如this(tests/mypackage_internal_test.go):

package mypackage

import (
    "testing"
)

func TestPrivate(t *testing.T) {

    mt := &MyType{}
    // Some test code
}  
Run Code Online (Sandbox Code Playgroud)

但有了这个,我才得到undefined: MyType.所以,我的问题是:我如何测试内部/私有方法?

fuz*_*fuz 9

为什么要将测试放在不同的包中?go测试机制_test用作测试文件的后缀,因此您可以将测试放在与实际代码相同的包中,从而避免您描述的问题.将测试放在单独的包中并不是Go中的惯用语.不要试图与Go公约作斗争,这不值得努力,你大部分都会放松战斗.

  • Go 支持在与主包相同的文件夹中声明后缀为“_test”的包 - 请参阅 https://tip.golang.org/cmd/go/#hdr-Test_packages “声明后缀为“_test”的包的测试文件将被编译为单独的包,然后与主测试二进制文件链接并运行”。这是专门为了让您可以进行与源代码内联的测试,而不必将它们包含在同一个包中,我认为这通常是一种反模式,因为它测试内部与导出的 API,并在导出的 API 中包含测试方法。 (3认同)