如何为接受 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;
}
如何在不必指定物理位置的情况下为此编写单元测试?注意:不幸的是,我不允许更改代码。
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。如果你通过了界面,你可以在想测试你的类时模拟它。
如果你以这种方式这样做,你就把文件系统排除在等式之外,这在单元测试中总是好的。