解决非主包中的相对路径问题

Problem with resolving relative paths in non-main package

我在解析我的 Go 应用程序中的相对文件路径时遇到问题。对于这个应用程序,我决定制作一个包,为不同的配置文件提供统一的界面。 conf 包包含相关的数据文件,所以这基本上是文件树:

app/conf
    + config.go
    + config.json
    + ...
app/code
    + code.go
    + code_test.go

问题是,当 app/code/code_test.go 中定义的测试调用 app/conf 包中的函数时,它又试图打开 app/conf/config.json,相对路径被弄乱了,因为工作目录位于 app/code.

依赖源代码中的配置文件路径不仅是单元测试中的问题,也是生产中的问题。通常,代码会做这样的事情:

  • 配置处理程序接受一个 io.Reader,它将从中读取配置。
  • main 将打开一个文件(其路径可能是硬编码的、通过命令行传递的、通过环境变量传递的,等等)并将其传递给配置处理程序以供读取。
  • 配置处理程序的单元测试会将一个配置(或多个配置,以测试不同的场景)硬编码为类似bytes.Buffer的内容,并将其传递给配置处理程序进行读取。
  • 除了读取配置文件的代码之外的任何单元测试(因此,任何使用配置但不操纵 it), 将在代码中生成 Config 结构,而不是从真实的 假文件中读取它,作为测试工具的一部分。例如,myConf := config.Config{SomeProp: "foo", OtherProp: true} 然后将其传递给被测函数。