为了账号安全,请及时绑定邮箱和手机立即绑定

无法在我的程序和单元测试中使用相同的相对路径

无法在我的程序和单元测试中使用相同的相对路径

Go
白猪掌柜的 2021-11-01 15:05:26
在我的 Go 项目中,我使用一个函数来打开特定文件并返回其内容。该文件存储在另一个目录中,但仍在我的项目目录中。package infrastructurefunc openKey() ([]byte, error) {    if path, err := filepath.Abs("../security/key.rsa"); err != nil {        return nil, err    }     return ioutil.ReadFile(path)}如果我从单元测试中调用它,则此函数有效。但是,如果我在程序中调用相同的函数,则会出现以下错误:2015/08/13 15:47:54 打开/me/go/src/github.com/myaccount/security/key.rsa:没有这样的文件或目录文件的正确绝对路径是:/me/go/src/github.com/myaccount/ myrepo /security/key.rsa使用该openKey函数的两个代码(来自我的程序和单元测试)都在同一个包中:infrastructure这是我执行程序的方式:去安装 && ../../../../bin/myproject以及我如何执行我的单元测试:去测试./...最后是我项目的目录结构:go/src/github.com/myaccount/myrepo/: - main.go- security:    - key.rsa // The file that I want to open    - ...- infrastructure    - openFile.go // The file with the func `openKey``    - server.go // The file with the func that call the func `openKey`    - openFile_test.go // The unit test that calls the func `openKey`编辑:以下是我的程序二进制文件所在位置的绝对路径:/Users/me/Documents/Développement/Jean/go/bin以及我的单元测试所在的位置:/var/folders/tj/8ywtc7pj3rs_j0y6zzldwh5h0000gn/T/go-build221890578/github.com/myaccount/myrepo/infrastructure/_test有什么建议吗?
查看完整描述

2 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

首先,运行测试时不应使用与在生产中运行应用程序时相同的文件。因为每个有权访问存储库的人都可以访问测试文件,这是一个安全失败。

正如评论中所说,问题在于运行测试时,工作目录是这些源代码(实际上,在运行测试之前将整个目录复制到临时目录中),而在运行程序时实际上,工作目录是您运行命令的目录,因此是错误的相对路径。

我的建议是使用配置选项来获取从中加载文件的文件(或与路径一起使用的基本目录)。要么使用环境变量(我强烈建议您这样做,请参阅12factors manofesto了解详细信息)、配置文件、命令行标志等。


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信