首页 > 解决方案 > 进行单元测试未找到所需文件

问题描述

我在 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
      }
}

标签: unit-testinggofile-location

解决方案


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

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

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

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

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

  3. 进一步解耦 helpers 包,使其不再依赖此文件,可能通过:

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

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


推荐阅读