unit-testing - 进行单元测试未找到所需文件
问题描述
我在 go 中编写了一个单元测试,并且同一个文件的 init 方法在项目的根目录中打开了一个文件。我遇到的问题是,当我运行测试时,测试包是不包含所需文件的根目录。如何告诉测试函数查看文件而不在测试文件的目录中创建重复文件?
文件结构:
main.go
|+-helpers
|+-data.go
|+-data_test.go
required_file.txt
测试命令:
go test github.com/testproj/helpers
data.go 中的代码:
func init() {
file, err := os.Open("required_file.txt")
if err != nil {
log.Fatal(err) <-- required_file.txt not found
}
}
解决方案
您的基本问题是您有两个过于紧密耦合的不同包。如果您的包的操作依赖于另一个包中包含的资源,那么实际上是:
- 它们不应该是两个不同的包;或者
- 您需要进一步解耦它们。
所以你有很多选择,在这里:
只是没有单独的“助手”包。如果该包中的功能除了帮助主包之外没有其他用途,则将它们组合起来,因为从概念上讲,它们不够独立,无法成为不同的包。如您所见,在 Go 中仅将文件夹用作组织代码的一种方式并不像在某些其他语言中那样好。
在主包和助手包中使用绝对路径完全限定文件名。如果两个独立的包确实依赖于同一个文件,那么无论任何一个包恰好位于何处,它们都应该能够找到它,并且这需要绝对路径。这可能是您最不理想的解决方案。
进一步解耦 helpers 包,使其不再依赖此文件,可能通过:
- 在你的主包中计算一个完全限定的文件名,并在你调用它们时将它传递给你的助手包中的函数;
- 在你的主包中打开文件,并
io.Reader
在你调用它们时将一个文件传递给你的助手包中的函数; - 在你的主包中打开文件,并在你调用它们时将文件的内容传递给你的助手包中的函数,也许作为一个
bytes
缓冲区;或者 - 从主包中的文件中提取您需要的信息,并在调用助手包时仅将相关信息传递给助手包中的函数。
请注意,无论如何,您最终都会遇到这种方法的问题。当你运行你的主应用程序时,你当前的工作目录默认是你执行程序时当前所在的目录。因此,除非您完全限定文件名,否则一旦您从源代码所在目录以外的任何目录运行应用程序,它也将无法找到所需的文件。
推荐阅读
- bibtex - 我可以批量更改 Endnote 中的字段吗?
- android - 如何使用不涉及背景的图像和标签创建可折叠工具栏?
- python - 合并具有相同标识符列的行 (PANDAS)
- java - 函数在 TelephonyManager.ACTION_PHONE_STATE_CHANGED 中多次触发
- inno-setup - 有没有办法使用 Inno Setup 删除 INI 文件中的注释?
- .net-core - Azure Functions v3 应用程序导入 .NET Core 3.1 项目时出现问题
- html - 有没有办法用href链接本地文件的页面?
- plot - 在 Stata 中创建 seaborn stripplot
- javascript - 将 chrome.storage 回调值分配给全局变量 javascript
- javascript - 反应火力基地等待然后完成