我有以下IntegrationTest项目结构......
如果我希望在126.txt
中使用该测试数据NUnit Test
,如何加载该普通txt文件数据?
注意:文件为-linked-
,我正在使用c#(如图所示)。
答案 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