C# Exists在UnitTest上下文中返回false
我已经转储了一个文件,其中包含一些用于单元测试的数据。 当代码尝试加载该文件时,它会获取FileNotFoundException 数据和代码文件在同一文件夹中相邻C# Exists在UnitTest上下文中返回false,c#,unit-testing,C#,Unit Testing,我已经转储了一个文件,其中包含一些用于单元测试的数据。 当代码尝试加载该文件时,它会获取FileNotFoundException 数据和代码文件在同一文件夹中相邻 项目测试 data.xml data.cs 似乎测试项目需要在生成后将文件复制到bin/Debug文件夹中。仅当您将“复制到输出目录”属性设置为“始终复制”时,才会执行此操作。测试项目似乎需要在生成后复制bin/Debug文件夹中的文件。只有当您将“复制到输出目录”属性设置为“始终复制”时,才会执行此操作。我不知道这是否适合您
- 项目测试
- data.xml
- data.cs
生成操作
属性,但是您不需要担心文件在哪里或是否存在
下面是一个读取文件的示例方法。我建议更改该方法,以字符串、XDocument或其他更适合您的数据类型的格式返回数据resource
将是文件的项目路径(即上面示例中的project.Test.data.xml
)
我不知道这是否适合您的目的,但我通常会将示例/数据/其他文件作为嵌入式资源。如果您选择这样做,您仍然需要在解决方案资源管理器中设置文件的
生成操作
属性,但是您不需要担心文件在哪里或是否存在
下面是一个读取文件的示例方法。我建议更改该方法,以字符串、XDocument或其他更适合您的数据类型的格式返回数据resource
将是文件的项目路径(即上面示例中的project.Test.data.xml
)
我只想指出,如果您正在从磁盘读取数据,那么您并不是在编写单元测试。单元测试在内存中运行,所有外部资源都应该使用测试双工(自制或通过框架)进行抽象。我只想指出,如果您是从磁盘读取,那么您就不是在编写单元测试。单元测试在内存中运行,所有外部资源都应该使用测试双工(自制或通过框架)进行抽象
private byte[] GetEmbeddedResourceBytes(string resource)
{
var asm = Assembly.GetExecutingAssembly();
using (var stream = asm.GetManifestResourceStream(resource)) {
if (stream != null) {
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream()) {
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) {
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
}
return new byte[0];
}