进行单元测试未找到所需文件

时间:2018-09-28 01:49:34

标签: unit-testing go file-location

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

1 个答案:

答案 0 :(得分:2)

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

  1. 它们不应是两个不同的程序包;或
  2. 您需要进一步分离它们。

因此,这里有许多替代方法:

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

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

  3. 进一步解耦辅助程序包,以使其不再依赖此文件,也许是通过以下方式实现的:

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

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