在init函数中使用相对路径时,我遇到了一个恼人的问题,单元测试找不到这个问题。
假设我有一个项目的结构如下:
.
├── conf
│ └── blacklist
├── filter
│ ├── filter.go
│ └── filter_test.go
在filter.go
的init
函数中,我尝试使用相对路径conf/blacklist
加载黑名单,以避免多次加载。由于默认的工作目录正是项目根目录,因此它可以很好地使用编译后的二进制文件。但是filter_test.go
会惊慌失措panic: open conf/blacklist: no such file or directory
,因为go测试总是使用包目录作为工作目录。
我还提到了这个解决方案,它可以动态构建相对路径来查找配置文件。在我添加covermode=set
标志并尝试进行一些覆盖测试之前,它确实运行良好。似乎covermode
会重写并生成一些类似_obj
的中间包,这使得动态相对路径不再工作。
以前有人遇到过同样的问题吗?几个月来,我还是新来的。如有任何建议,我们将不胜感激。
一个简单的解决方案是使用类似SRC_ROOT=$PWD go test
的东西运行测试,然后在测试内部使用os.Getenv("SRC_ROOT")
访问文件。