设计XML文档的单元测试

时间:2010-09-30 04:42:54

标签: visual-studio unit-testing

我有一个以下方法,它接受一个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
*/
}

1 个答案:

答案 0 :(得分:2)

看起来你基于两种不同的条件做了两件不同的事情,所以我会写两种不同的测试 - 可能更多(测试不同的组合)。

至于传递给方法的数据 - 你没有告诉我们任何涉及的条件。它们只是基于您传递给方法的数据,还是依赖于(比如)被测试类的构建方式?基本上为每个测试提供一个简单的文档(简单,“之前”和“之后”都很容易理解),它可以让您检查相关节点是否已被替换/删除。