【发布时间】:2021-05-21 02:15:01
【问题描述】:
我有一个名为“RegressionTests”的单元测试项目。
这里有各种子文件夹,其中一个叫做“FileUpload”
在这个文件夹中有一个名为“FileUploadRegressionTests.cs”的cs文件和一个名为“test.txt”的源文件。 test.txt 设置为复制到输出文件夹。
在我运行它的单元测试中,我尝试以下操作:
if (System.IO.File.Exists("test.txt")) {Console.Write("FOUND 1\r\n");}
if (System.IO.File.Exists("FileUpload\\test.txt")) {Console.Write("FOUND 2\r\n");}
if (System.IO.File.Exists("C:\\dev\\...FileUpload\\test.txt")) {Console.Write("FOUND 3\r\n");}
所以我在这里尝试访问该文件。如果我使用相对路径 test.txt 或 'FileUpload\test.txt'(因为在输出文件夹中它被复制到项目子文件夹中),它不会找到该文件。只有当我使用绝对路径时,它才会找到文件...我不能这样离开,否则如果下一个运行测试的人将项目克隆到不同的文件夹中,将会失败。
我试图通过以下方式获取当前目录:
System.IO.Directory.GetCurrentDirectory()
但这只是返回 C:\Windows\System (或类似的东西)
如何使用相对路径引用我的文件?
【问题讨论】:
-
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) 给你什么?
-
不要在单元测试中使用 IO 硬东西。在您的应用程序中,您可以依赖 IO 特定的东西,并在单元测试中模拟它。在单元测试中使用文件系统会使任务变得非常慢。
-
@BugFinder 我尝试了 GetExecutingAssembly 的各种迭代,它们似乎产生了空值 - 我认为这可能与它是一个单元测试而不是一个实际的可执行输出文件有关?
-
@ntohl 目前,我真的不介意我用哪种方式来做这件事——现在工作比现在慢工作要好! :) ...但我同意运行一个简单的测试确实需要一段时间(5-10秒):(
-
@code_fodder 单元测试无论如何都有特殊的文件夹处理...stackoverflow.com/a/649449/1859959。只需使用
IFileSystem.Read / Write将自己从问题的整个主题中解放出来,然后比较内存中的test.txt,并通过FileSystemMock检查文件是否存在。
标签: c# windows unit-testing visual-studio-2013