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

本文关键字:参数 方法 单元测试 路径 xml 文件 | 更新日期: 2023-09-27 18:31:17

我知道单元测试应该与任何依赖项隔离。我正在尝试使用 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;
 }

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

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

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

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

您始终可以创建一个临时 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方法在每个测试用例之前执行,Teardown方法在每个测试用例之后执行

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

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

如果你以这种方式这样做,你就把文件系统排除在等式之外,这在单元测试中总是好的。