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

Pur*_*ome 40 .net c# testing tdd nunit

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

在此输入图像描述

如果我想使用测试数据126.txt中的NUnit Test,我怎么加载普通的txt文件的数据?

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

欢呼:)

Dar*_*rov 58

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

string text = File.ReadAllText(TestContext.CurrentContext.TestDirectory + "\\TestData\\126.txt");
Run Code Online (Sandbox Code Playgroud)

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

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 当ReSharper的测试运行器执行测试时,第一种方法不起作用.它尝试从"AppData\Local\JetBrains\Installations\...."加载文件.如果使用nunit,解决方案是首先使用"TestContext.CurrentContext.TestDirectory"到正确的目录. (8认同)
  • .Net 中的连接路径应该使用辅助方法,例如 Path.Combine 而不是字符串连接,以避免将错误引入应用程序和/或系统。 (5认同)
  • 对于这种方式,您需要将文件的“构建操作”设置为“ EmbeddedResource”,而不仅仅是“ Resource”。由于“ WPF”以其他方式对待我,我感到困惑:[link](/sf/ask/659372801/) (2认同)

Ben*_*ghs 38

如果您不希望文件作为ManifestResources,而只是作为系统上的文件.在确定程序集的目录时,请参阅NUnit的麻烦以获取更多信息,特别是此答案

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

但这里是快速信息:

Path.Combine(TestContext.CurrentContext.TestDirectory, @"Files\test.pdf")
Run Code Online (Sandbox Code Playgroud)

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

所有的积分都发给了另一篇文章中的人,但是我花了一些时间才找到答案,这就是我为这篇文章添加答案的原因.


kdb*_*man 19

这个问题目前已得到解答,但对于搜索其他可能性的google:

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

代码是礼貌的答案.


mon*_*nty 5

发现使用TestContext.CurrentContext.TestDirectory. 这在设置中非常有效,但是当我从提供给 TestCaseSource 的方法中调用它时,静态方法在所有其他代码之前调用,并返回以下内容:

C:\Users\<username>\.nuget\packages\nunit\3.10.1\lib\netstandard2.0
Run Code Online (Sandbox Code Playgroud)

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

C:\SVN\MyApp\trunk\MyApp.Tests\bin\Debug\netcoreapp2.1
Run Code Online (Sandbox Code Playgroud)