【问题标题】:How to write Unit Test for a method that accepts an xml filepath as a parameter如何为接受 xml 文件路径作为参数的方法编写单元测试
【发布时间】:2012-04-17 08:56:48
【问题描述】:

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

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

【问题讨论】:

  • 那么,如果您不允许更改代码 - 如果单元测试暴露了错误会发生什么?说真的 - 添加一个接受 XmlDocument 或流的重载并对其进行测试。然后重写当前实现以简单地委托给新方法。
  • @Cwan true,测试不允许更改的代码很奇怪
  • 这也是我很生气的地方,但我不是老板。但我会尝试与他们推理,因为他们非常热衷于为他们的遗留应用程序编写单元测试。
  • @AzharKhorasany 我去过那里!我完全明白你的意思:)

标签: c# .net unit-testing typemock


【解决方案1】:

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

但是,让我做一个一般说明,文件系统的依赖项应该与数据库的依赖项以相同的方式隔离。在像您这样的情况下,我通常从某种 FileManager 提供的流或字节数组中加载 XML 文档:IFileManager。这个文件管理器封装了文件系统操作。

【讨论】:

    【解决方案2】:

    您始终可以创建一个临时 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!

    【讨论】:

    • 谢谢,但我正在使用带有 Visual Studio 单元测试编辑器的 Typemock。
    • @Azhar:我假设您的意思是您正在使用 MSTest - 将 [SetUp]/[TearDown] 替换为 [TestInitialize]/[TestCleanup]。
    【解决方案3】:

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

    如果您以这种方式执行此操作,您将文件系统排除在等式之外,这在单元测试中总是很好。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多