如何将此文件加载到NUnit测试中?

时间:2011-05-21 08:35:44

标签: c# .net testing tdd nunit

我有以下IntegrationTest项目结构......

enter image description here

如果我希望在126.txt中使用该测试数据NUnit Test,如何加载该普通txt文件数据?

注意:文件为-linked-,我正在使用c#(如图所示)。

欢呼:)

4 个答案:

答案 0 :(得分:52)

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

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

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

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();
}

答案 1 :(得分:35)

如果您不希望文件作为ManifestResources,而只是作为系统上的文件。有关详细信息,请参阅Trouble with NUnit when determining the assembly's directory,特别是this answer

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

的信息

但这是快速信息:

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

Where Files \ test.PDF只是测试项目中的一个文件,带有构建操作内容,如果更新则复制到输出目录副本

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

答案 2 :(得分:19)

这个问题目前已得到解答,但对于寻求其他可能性的谷歌来说:

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

要解决此问题,您可以通过查找测试DLL的目录来获取bin\Debug\...目录,如下所示:

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静态类中,这样我就可以在每个需要加载外部文件的测试中使用它。

代码由this answer提供。

答案 3 :(得分:1)

使用TestContext.CurrentContext.TestDirectory找到了陷阱。这在安装程序中完美地工作,但是当我从提供给TestCaseSource的方法中调用它时,将在所有其他代码之前调用静态方法,并返回以下内容:

C:\Users\<username>\.nuget\packages\nunit\3.10.1\lib\netstandard2.0

但是,在两个地方使用TestContext.CurrentContext.WorkDirectory都可以得到期望的结果:

C:\SVN\MyApp\trunk\MyApp.Tests\bin\Debug\netcoreapp2.1