我已经在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
}
}
答案 0 :(得分:2)
您的基本问题是您有两个紧密结合的不同软件包。如果您有一个依赖于另一个软件包中包含的资源的操作的软件包,那么实际上可以:
因此,这里有许多替代方法:
只是没有单独的“助手”包。如果该程序包中的功能除了帮助主程序包之外没有其他用途,则可以将它们组合在一起,因为从概念上讲,它们的独立性不足以使其成为不同的程序包。如您所见,在Go语言中,仅使用文件夹作为组织代码的方法并不像使用其他某些语言那样好。
在主软件包和辅助软件包中完全用绝对路径限定文件名。如果确实两个独立的软件包都依赖于同一文件,则无论这两个软件包恰好位于何处,它们都应该能够找到该文件,并且这需要绝对路径。这可能是您最不理想的解决方案。
进一步解耦辅助程序包,以使其不再依赖此文件,也许是通过以下方式实现的:
io.Reader
传递给文件到辅助程序包中的函数; bytes
缓冲区;或请注意,无论如何,这种方法最终都会遇到问题。运行主应用程序时,默认情况下,当前工作目录将是执行程序时当前所在的目录。因此,除非您完全限定文件名,否则只要从源代码所在的目录以外的任何目录运行应用程序,那么该目录也将无法找到所需的文件。