在单元测试中比较文本

5
我需要比较两个文本块以确定我的单元测试是否通过。不幸的是,这段文本大约有500个字符,如果只有一个字符不同,很难检测出问题所在。MSTest没有告诉我哪些单个字符不同,它只告诉我有差异。在单元测试时,最好的比较文本的方法是什么?(我正在使用MSTest(我考虑过转移到NUnit,但我宁愿不这样做,因为我所有的测试都已经在MSTest中编写了))。
3个回答

7

有一个专门为这种情况设计的库Approval Tests。它支持

该库是围绕“Golden Copy”测试方法构建的,即主数据集的可信副本,您将准备并验证一次。

[TestClass]
public Tests
{
    [TestMethod]
    public void LongTextTest()
    {
        // act: get long-long text
        string longText = GetLongText();

        //assert: will compare longText variable with file 
        //    Tests.LongTextTest.approved.txt
        // if there is some differences, 
        // it will start default diff tool to show actual differences
        Approvals.Verify(longText);
    }
}

谢谢Akim,我会试试这个,因为我喜欢它与Tortoise的集成。 - atreeon
它与“_default_”差异工具集成,对于您来说,这可能是TortoiseDiff。无论如何,如果您经常使用长文本或图像进行工作,那么这个库值得一看。 - Akim

2
您可以使用MSTest的CollectionAssert类来进行相关操作。
[TestMethod]
public void TestTest()
{
    string strA = "Hello World";
    string strB = "Hello World";

    // OK
    CollectionAssert.AreEqual(strA.ToCharArray(), strB.ToCharArray(), "Not equal!");

    //Uncomment that assert to see what error msg is when elements number differ
     //strA = "Hello Worl";
    //strB = "Hello World";
    //// Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException: CollectionAssert.AreEqual failed. Not equal!(Different number of elements.)
    //CollectionAssert.AreEqual(strA.ToCharArray(), strB.ToCharArray(), "Not equal!");

    //Uncomment that assert to see what error msg is when elements are actually different
    //strA = "Hello World";
    //strB = "Hello Vorld";
    //// Microsoft.VisualStudio.TestTools.UnitTesting.AssertFailedException: CollectionAssert.AreEqual failed. Not equal!(Element at index 6 do not match.)
    //CollectionAssert.AreEqual(strA.ToCharArray(), strB.ToCharArray(), "Not equal!");

}

嗯,这可能好一些,但它只告诉我有不同数量的元素,而不是差异存在的位置(现在准备尝试上面的方法)。 - atreeon
如果元素数不同,则会告诉你“元素数量不同”。如果字符不同,则会告诉您差异存在的位置,“第6个索引处的元素不匹配”。实际上,您可以推入您的 IComparer 类,它将按您所需的方式编写此类信息。 - nikita
我在哪里可以找到那个信息?我只看到了结果消息:CollectionAssert.AreEqual失败。(元素数量不同。)结果堆栈跟踪:位于HtmlHelpers\T_KOExtensions.cs的ShouldRenderKOPopoutShowFor(),第44行。 - atreeon
所以我只得到了错误的行号和“元素数量不同”的提示。也许我使用 MSTest 不正确?是否有更详细的错误视图? - atreeon
那是因为你的测试在第二个断言上失败了。注释掉它,这样最后一个断言才能成功地失败。 - nikita
谢谢Nikita,这是一种解决方案,但我想找一个更全面一些的东西。 - atreeon

1

编写一个辅助函数来进行比较。

if(!String.Equals(textA, textB, StringComparison.OrdinalIgnoreCase))
{
  int variesAtIndex = Utilities.DoByteComparison(textA,textB); // can be multiple, return -1 if all good
} // now assert on variesAtIndex`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接