如何为接受xml文件路径作为参数的方法编写单元测试

时间:2012-04-17 08:56:49

标签: c# .net unit-testing typemock

我知道单元测试应该与任何依赖项隔离开来。我正在尝试使用Typemock为应用程序编写单元测试。问题是类中的一个方法接受一些Xml文件路径参数,然后在方法中创建一个XMLDocument对象,以便在方法中的某个地方使用。

 public bool ValidateXml(String aFilePath, String ruleXmlPath)
 {
     XmlDocument myValidatedXml = new XmlDocument();
     try
     {
         myValidatedXml.Load(aFilePath);
     }
     catch
     {
         return false;
     }


     XmlDocument myRuleXml = new XmlDocument();
     try
     {
         myRuleXml.Load(ruleXmlPath);
     }
     catch
     {
         return false;
     }

     MyClass myObject = new MyClass(myValidatedXml);
     //Do something more with myObject.

     XmlNodeList rules = myRuleXml.SelectNodes("//rule");
     //Do something more with rules object.

     return true;
 }

如何在不指定物理位置的情况下为此编写单元测试? 注意:遗憾的是我不允许更改代码。

3 个答案:

答案 0 :(得分:3)

AB Kolan的建议可以作为一种解决方法。您还可以在测试项目中拥有一组测试XML文件,并将这些文件的路径传递给测试中的测试方法。

但是,让我一般要注意,文件系统的依赖关系应该与数据库中的依赖关系在同一个fashoin中隔离。在像你这样的情况下,我通常从流或从某种FileManager:IFileManager提供的字节数组加载XML文档。此文件管理器封装了文件系统操作。

答案 1 :(得分:1)

您始终可以创建临时Xml并传递临时文件的路径,然后在执行测试后将其删除。在NUnit中,可以使用[SetUp][TearDown]属性轻松完成此操作。

[TestFixture]
public class MyTest 
{
    private string tempPathXML;

    [SetUp]
    public void SetUp()
    {
        //Create XML file 
        // Save it in a temp path
    }

    [TearDown]
    public void TearDown()
    {
        //Delete the temp file
    }

    public void SampleTestForValidateXml()
    {
        //Test using tempPathXML
    }
}

Setup方法在每个测试用例之前执行<{1}}方法> 每个测试用例后

注意:对于MSTest,Teardown[Setup]属性可分别替换为[TearDown][TestInitialize]。谢谢Cwan!

答案 2 :(得分:1)

你应该重构,所以你传递一个XmlDocument。甚至更好;一个包装器 - 让我们称它为XmlDocWrapper - 它封装了XmlDocuments功能。包装器可以有一个接口 - IXmlDocWrapper。如果您通过界面,则可以在要测试课程时进行模拟。

如果以这种方式执行此操作,则会使文件系统脱离等式测试中始终良好的等式。