我有一个以下方法,它接受一个XDocument,遍历节点并根据某些条件删除/替换节点。
public static void Format(XDocument xDocument)
{
foreach(XmlNode documentNode in xDocument)
{
XmlNode[] spanNodes =documentNode.SelectNodes("//span") ;
foreach(XmlNode spanNode in spanNodes)
{
if(spanNode .Attributes["class"]!=null
&& !string.IsNullOrEmpty(spanNode.Attributes["class"].value)))
{
string styleName = spanNode.Attributes["class"].value;
string styleActionMapping = GetActionMappingForStyle (styleName);
switch (styleActionMapping)
{
case StyleActionMapping.Remove
RemoveSpanNode(spanNode);
break;
case StyleActionMapping.ReplaceWith
ReplaceSpanNode(spanNode);
break;
case StyleActionMapping.Keep
break;
}
}
}
}
}
现在我想在VS 2010中为上述方法设计单元测试。我在存储(XML /数据库)中有示例输入和预期输出,我正在考虑将输入数据传递给函数并将其输出与预期输出相匹配。我的问题是我应该只为Format(XDocument)编写一个[TestMethod],还是应该为RemoveNode()和ReplaceNode()分别编写一个。只为Format()编写一个[TestMethod]很容易,但我不确定如果这违反了单元测试的原则,其中一次只能测试一件事(并且在Format()方法中发生了许多事情)。另外,我不确定如果我选择测试ReplaceNode()和RemoveNode(),我如何为它们编写测试方法,即我应该传递给那些方法的数据。有人可以给我任何指示吗?
测试方法应如下所示: -
[TestMethod]
CheckExpectedOutput_OnRemove(XDocument document)
{
/*
1) document has data only for remove
2) call Format() and get the output
3) Check the output in the step 2 and match with the expected output
*/
}
[TestMethod]
CheckExpectedOutput_OnReplace(XDocument document)
{
/*
1) document has data only for replace
2) call Format() and get the output
3) Check the output in the step 2 and match with the expected output
*/
}
答案 0 :(得分:2)
看起来你基于两种不同的条件做了两件不同的事情,所以我会写两种不同的测试 - 可能更多(测试不同的组合)。
至于传递给方法的数据 - 你没有告诉我们任何涉及的条件。它们只是基于您传递给方法的数据,还是依赖于(比如)被测试类的构建方式?基本上为每个测试提供一个简单的文档(简单,“之前”和“之后”都很容易理解),它可以让您检查相关节点是否已被替换/删除。