如何单元测试读取xml文件的类?

时间:2010-06-13 07:21:49

标签: .net unit-testing nmock2

我需要为读取xml文件并解析其内容的类编写单元测试。 我该如何模拟文件读取?因为测试的所有内容都应该反对读取文件。

我将nmock2与nUnit一起使用。

谢谢

2 个答案:

答案 0 :(得分:7)

正如rwwilden所说,如果你使用基于流的API而不是基于文件名的API,生活会轻松得多。使用模拟在这里并不十分合适,IMO;你没有做“协议测试” - 你只需要一个数据源。

您还可以提供一种过载,这是一种简单的实用方法:

 public Result ParseXml(string file)
 {
     using (Stream stream = File.OpenRead(file))
     {
         return ParseXml(stream);
     }
 }

然后你可以合理安全测试那个方法 - 毕竟它没有重要的逻辑。

现在您可以通过在代码中使用硬编码字符串来测试基于流的API,然后调用Encoding.UTF8.GetBytes(xml)并在生成的字节数组周围构建MemoryStream ...但我通常更喜欢在我的测试项目中使用单独的数据文件。将内容类型设置为“embedded resource”,然后使用Assembly.GetManifestResourceStream获取测试文件的流。

如果这确实是一个普通的XML文件,你真的想自己做解析吗?您是否有任何理由不想将其留给框架,并根据DOM API,LINQ to XML或XmlReader来表达您的API?

答案 1 :(得分:3)

您所要做的就是找到一种方法告诉您的班级要阅读的文件。所以这取决于你的课程如何实施。最简单的方法是这样的:

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文件,并且您知道该文件的结果是什么。