Go单元测试未找到所需文件

str*_*tor 5 unit-testing file-location go

我在 go 中编写了一个单元测试,同一文件的 init 方法在项目根目录中打开一个文件。我遇到的问题是,当我运行测试时,测试包是根目录,不包含所需的文件。如何告诉测试函数查看该文件而不在测试文件的目录中创建重复文件?

文件结构:

main.go
|+-helpers
   |+-data.go
   |+-data_test.go
required_file.txt
Run Code Online (Sandbox Code Playgroud)

测试命令:

go test github.com/testproj/helpers
Run Code Online (Sandbox Code Playgroud)

data.go 中的代码:

func init() {
    file, err := os.Open("required_file.txt") 
      if err != nil {
        log.Fatal(err) <-- required_file.txt not found
      }
}
Run Code Online (Sandbox Code Playgroud)

Cro*_*man 3

你的根本问题是你有两个不同的包,它们耦合得太紧密。如果您有一个包,其操作依赖于另一个包中包含的资源,那么实际上:

  1. 它们不应该是两个不同的包;或者
  2. 您需要进一步将它们解耦。

所以你有很多选择,在这里:

  1. 只是没有单独的“助手”包。如果该包中的功能除了帮助主包之外没有其他目的,那么请将它们组合起来,因为从概念上讲,它们不够独立,无法成为不同的包。正如您所看到的,在 Go 中仅仅使用文件夹作为组织代码的一种方式并不像在其他一些语言中那样好。

  2. 在主包和助手包中使用绝对路径完全限定文件名。如果两个独立的包确实依赖于同一个文件,那么无论任何一个包恰好位于何处,它们都应该能够找到它,并且这需要绝对路径。这可能是您最不理想的解决方案。

  3. 进一步解耦帮助程序包,使其不再依赖于该文件,也许可以通过以下方式:

    • 在主包中计算完全限定的文件名,并在调用帮助程序包中的函数时将其传递给它们;
    • 打开主包中的文件,并io.Reader在调用帮助程序包中的函数时将文件传递给它们;
    • 打开主包中的文件,并在调用帮助程序包中的函数时将文件的内容传递给它们,也许作为缓冲区bytes;或者
    • 从主包中的文件中提取所需的信息,并在调用帮助程序包中的函数时仅将相关信息传递给它们。

请注意,无论如何,您最终都会遇到这种方法的问题。当您运行主应用程序时,当前工作目录默认为执行程序时当前所在的目录。因此,除非您完全限定文件名,否则一旦您从源代码所在的目录以外的任何目录运行应用程序,它也将无法找到所需的文件。