关于c#:如何将此文件加载到NUnit测试中?

How can I load this file into an NUnit Test?

我有以下集成测试项目结构…

enter image description here

如果我想在NUnit Test中使用该测试数据126.txt,如何加载该纯文本文件数据?

注意:文件是-linked-,我使用的是c(如图所示)。

干杯:


可以在要复制到输出文件夹的文件的属性中以及单元测试内部指定:

1
string text = File.ReadAllText(TestContext.CurrentContext.TestDirectory +"TestData\\126.txt");

作为替代方案,您可以将此文件作为资源嵌入测试程序集中,然后:

1
2
3
4
5
6
var assembly = Assembly.GetExecutingAssembly();
using (var stream = assembly.GetManifestResourceStream("ProjectName.Tests.IntegrationTests.TestData.126.txt"))
using (var reader = new StreamReader(stream))
{
    string text = reader.ReadToEnd();
}


如果不希望文件作为清单资源,而是作为系统上的文件。在确定程序集的目录时,请参阅nunit的问题以了解更多信息,尤其是此答案。

同样有趣的是来自nunit的信息https://bugs.launchpad.net/nunit vs adapter/+bug/1084284/comments/3

但以下是快速信息:

1
Path.Combine(TestContext.CurrentContext.TestDirectory, @"Files\test.pdf")

其中,files est.pdf只是测试项目中的一个文件,包含构建操作内容,如果更新,则复制到输出目录

所有的学分都发给了其他职位的人,但我花了一段时间才找到答案,这就是我为什么要在这篇文章中添加答案的原因。


此问题目前已得到解答,但对于搜索其他可能性的谷歌用户:

如果您得到一个DirectoryNotFoundException,因为测试是在C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common...而不是在bin\Debug\...中查找的,这意味着您的测试适配器是从不是您的测试项目输出目录的路径执行的。

要解决这个问题,您可以通过如下方式查找测试dll的目录来获取bin\Debug\...目录:

1
2
3
4
5
6
7
using System.IO;
using System.Reflection;

// Get directory of test DLL
var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

// dir is now"C:\...\bin\Debug" or wherever the executable is running from

我把它放在测试项目中的一个TestHelpers静态类中,这样我就可以在每个需要加载外部文件的测试中使用它。

代码是由这个答案提供的。


TestContext.CurrentContext.TestDirectory找到了一个gotcha。这在设置中非常有效,但是当我从提供给testcasesource的方法中调用它时,静态方法在所有其他代码之前被调用,并返回以下内容:

1
2
3
C:\Users\<username>\.nuget\packages
unit\3.10.1\lib
etstandard2.0

然而,使用TestContext.CurrentContext.WorkDirectory在这两个地方都能得到预期的结果:

1
2
C:\SVN\MyApp\trunk\MyApp.Tests\bin\Debug
etcoreapp2.1