如前所述,没有任何方法可以“授予”对未导出标识符的访问权限。
关于的一些澄清fmt
不过,包的测试是必要的/合理的。
有2种测试:黑盒子测试和白盒测试。
黑盒子测试是指您将包视为“黑盒”,并且仅通过其导出的标识符(通过其“公共 API”,其他包看到的)对其进行测试。在这种情况下,测试文件具有不同的包名称(例如fmt_test
当测试时fmt
包裹)。
白盒测试是指使用包的导出和未导出标识符。要创建白盒测试,请在测试文件中指定与正在测试的包相同的包名称(因此,fmt
如果出现以下情况fmt
包测试)。
标准库中包含的测试fmt
包裹intend成为黑盒测试,但这样就无法测试所有内容。所以 Go 的作者们尝试了mixed版本:他们包括一个单一的export_test.go
使用相同包声明的测试文件(package fmt
)因此它可以访问未导出的标识符fmt
包,并且它“导出”2个标识符,以便其他(黑盒)测试文件可以访问:
var IsSpace = isSpace
var Parsenum = parsenum
The authors did so because they wanted to minimize the use of unexported identifiers, and so this explicitly marks what unexported identifiers are used, and basically acts as a "bridge" between the fmt
package and the black-box tests of the fmt
package.
这里要注意的一件事是,这些只会“导出”到fmt
封装(以及白盒测试fmt
当然),并且不适用于其他包或其他包的测试。原因很简单,因为测试文件在构建包时不会被解析和编译,只有在运行包测试时才会被解析和编译。
解决方案?
未导出的标识符用于包本身,与其他人无关。这意味着没有其他包应该想要测试它们。如果需要测试它们,则必须在包自己的测试中完成。
如果对于集成测试,您需要访问未导出的标识符,则包必须导出“某些内容”,该内容要么公开值(或其某些部分),要么在不导出敏感数据或实现细节的情况下帮助测试。如果包 API 设计良好且测试彻底,则永远(很少)不需要这样做。