我需要为读取 xml 文件并解析其内容的类编写单元测试。如何模拟文件读取?因为测试的所有内容都应该针对读取文件。
我将 nmock2 与 nUnit 一起使用。
谢谢
我需要为读取 xml 文件并解析其内容的类编写单元测试。如何模拟文件读取?因为测试的所有内容都应该针对读取文件。
我将 nmock2 与 nUnit 一起使用。
谢谢
正如 rwwilden 所建议的那样,如果您使用基于流的 API 而不是基于文件名的 API,生活会容易得多。IMO,在这里使用模拟不太合适;你不是在做“协议测试”——你只是想要一个数据源。
您还可以提供一个重载,这是一种简单的实用方法:
public Result ParseXml(string file)
{
using (Stream stream = File.OpenRead(file))
{
return ParseXml(stream);
}
}
然后,您可以合理地安全地不测试该方法 - 毕竟它没有重要的逻辑。
现在您可以通过在代码中使用硬编码字符串来测试基于流的 API,然后围绕生成的字节数组调用Encoding.UTF8.GetBytes(xml)
和构建...但我通常更喜欢在我的测试项目中使用单独的数据文件。MemoryStream
将内容类型设置为“嵌入式资源”,然后用于Assembly.GetManifestResourceStream
获取测试文件的流。
如果这确实是一个普通的 XML 文件,您真的想自己进行解析吗?您是否有任何理由不想将其留给框架,并以 DOM API、LINQ to XML 或XmlReader
.
您所要做的就是找到一种方法告诉您的班级要阅读什么文件。所以这在一定程度上取决于你的类是如何实现的。最简单的方法是这样的:
public class ClassToTest : IClassToTest
{
public Result ParseXml(Stream xml)
{
// Parse xml and return result.
return ...;
}
}
[Test]
public void TestParseXml()
{
// Get xml stream to test from somewhere.
Stream xmlStream = ...;
// Call method to test.
var result = new ClassToTest().ParseXml(xmlStream);
// Assert results.
Assert.IsNotNull(result);
...
}
这个想法是,您以某种方式为您正在测试的类提供您创建的 xml 文件,并且您知道预期的解析结果。