Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Go测试与文件系统一起工作_Go_Testing_Visual Studio Code - Fatal编程技术网

如何使Go测试与文件系统一起工作

如何使Go测试与文件系统一起工作,go,testing,visual-studio-code,Go,Testing,Visual Studio Code,使用VsCode测试Go应用程序时遇到一些问题。这是我的launch.json { "name": "Test", "type": "go", "request": "launch", "mode": "test", "program": "${workspaceFolder}/test", "env": {}, "args": [] } 现在我有一个问题,我的应用程序应该在一个子文件夹(atm it's./temp)中写入文件。为此,我有两个函数,第一个是确定文

使用VsCode测试Go应用程序时遇到一些问题。这是我的launch.json


{
  "name": "Test",
  "type": "go",
  "request": "launch",
  "mode": "test",
  "program": "${workspaceFolder}/test",
  "env": {},
  "args": []
}
现在我有一个问题,我的应用程序应该在一个子文件夹(atm it's./temp)中写入文件。为此,我有两个函数,第一个是确定文件路径

func getFilePath()字符串{
dir,err:=filepath.Abs(filepath.dir(os.Args[0]))
如果错误!=零{
恐慌(错误)
}
return dir+“/temp/ocicd config.yaml”
}
另一个用来保存文件

func SaveToYaml(Config Structs.Project){
fmt.Println(“保存配置”)
yaml,err:=yaml.Marshal(配置)
如果错误!=零{
恐慌(错误)
}
格式打印项次(字符串(yaml))
WriteFile(getFilePath(),yaml,0644)
}
以及加载文件

func Load()结构项目{
fmt.Println(“加载配置”)
文件,err:=ioutil.ReadFile(getFilePath())
如果错误!=零{
恐慌(错误)
}
项目:=Structs.project{}
err=yaml.Unmarshal(文件和项目)
如果错误!=零{
恐慌(错误)
}
返回项目
}

现在的问题是VsCode使应用程序在./test子文件夹中运行,这使我的应用程序尝试从./test/temp加载并保存到./test/temp,这不是我想要的。我试图将launch.json更改为实际使用${workspace}作为程序,并使用“./test”作为参数,但这会使测试停止一起工作。现在我迷路了。有没有办法解决这个问题?

与其让测试直接写入磁盘上的文件(此模型可能会出现并发问题),不如在文件系统的顶部使用一层抽象(而不是
ioutil


这是一个很好的图书馆。对于您的测试用例,您只需传递一个MemFs层而不是OsFs(说明)。

为什么您的测试实际上要写入磁盘?为什么不创建一个实现
ReadWriter
接口的缓冲区,并将其保存在内存中呢?对于项目根目录,我通常只将其设置为环境变量(例如
project\u root=$(pwd)
,然后我可以在代码中引用它。或者,您可以检查目录是否以“test/”结尾如果是这样的话,就上升一个,尽管使用env变量更简单。测试总是在工作目录设置为包含该测试源代码的目录下执行。这是
go test
的行为,而不是VSCode。另一方面,测试二进制文件的位置没有定义(但通常是系统临时目录)。因此,如果您确实需要文件系统,您可以而且应该在测试中依赖相对路径。顺便说一句,这是获取可执行文件路径的首选函数。如前一条注释所述,请使用相对于当前工作目录的路径,而不是可执行文件的路径。谢谢,这是一种很好的方法。仅从go after sev开始多年的类型和javascript以及我的替代方案都是切换到依赖注入,但我非常缺少typescript中参数的默认值