我知道单元测试应该与任何依赖项隔离开来。我正在尝试使用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;
}
如何在不指定物理位置的情况下为此编写单元测试? 注意:遗憾的是我不允许更改代码。
答案 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。如果您通过界面,则可以在要测试课程时进行模拟。
如果以这种方式执行此操作,则会使文件系统脱离等式测试中始终良好的等式。