为了账号安全,请及时绑定邮箱和手机立即绑定

VS 单元测试不会将预期结果和实际结果视为相等

VS 单元测试不会将预期结果和实际结果视为相等

C#
白衣染霜花 2021-07-06 13:04:09
在不久的将来,我们将在工作中转向 TDD 风格的开发,所以我正在尝试 VS 2013 附带的 VS 单元测试(这是我们在工作中使用的)。我正在尝试使用 TDD 编写一个可以找到 Kaprekar 常量的类。我正处于开发的某个阶段,我有一个提交有效数字的测试,我希望有一个包含一个元素的列表返回。该元素将由一个 3 元胞数组组成。这三个单元格将包含原始数字、一个数字按降序排列的数字和一个数字按升序排列的数字。我的调试代码显示我得到了预期的结果,但单元测试说我没有。我需要做什么才能让单元测试看到预期和实际结果相等?这是我的代码的删节版。单元测试代码:namespace KaprekarsConstantTest{[TestClass]public class UnitTest1{    private Kaprekar k;    [TestInitialize]    public void Init()    {        k = new Kaprekar();    }    [TestMethod]    public void FirstRow()    {        int[] row = new int[3];        row[0] = 5324;        row[1] = 5423;        row[2] = 2345;        List<int[]> expected = new List<int[]>();        expected.Add(row);        List<int[]> actual = k.Generate(5324);        int[] rslt = actual[0];        int[] expct = expected[0];        CollectionAssert.AreEqual(expected, actual,            "\nExpect: " + expct[0].ToString() + "; " + expct[1].ToString() + "; " + expct[2].ToString() +            "\nActual: " + rslt[0].ToString() + "; " + rslt[1].ToString() + "; " + rslt[2].ToString() + "\n");    }  }}应用代码namespace KaprekarsConstant{public class Kaprekar{    public List<int[]> Generate(params int[] orgNum)    {        List<int[]> rtnVal = new List<int[]>();        int num = orgNum[0];        string digits = num.ToString();        int[] row = new int[3];        row[0] = num;        List<int> lstDigits = new List<int>();        string snglNum = String.Empty;        for (int ndx = 0; ndx < 4; ndx++)        {            snglNum = digits[ndx].ToString();            lstDigits.Add(int.Parse(snglNum));        }测试结果测试名称: FirstRow测试全名: KaprekarsConstantTest.UnitTest1.FirstRow测试源:* ...\Projects\C_Sharp\KaprekarsConstant\KaprekarsConstantTest\UnitTest1.cs :第 51 行测试结果: 失败测试时间: 0:00:00.0033773结果消息: CollectionAssert.AreEqual 失败。预计:5324;5423; 2345实际:5324;5432; 2345(索引 0 处的元素不匹配。)结果 StackTrace: 在 KaprekarsConstantTest.UnitTest1.FirstRow() in …\Projects\C_Sharp\KaprekarsConstant\KaprekarsConstantTest\UnitTest1.cs:line 61
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

此测试失败的原因有两个:

  • 每个 List 的第一个元素(元素 0)是一个包含三个元素的数组。它们实际上并不匹配 - 第一个元素的第二个元素是 54 23和 54 32。即使你解决了这个问题,它仍然会失败,因为......

  • 其次,您需要告诉 .NET 对列表的元素进行结构比较,默认情况下它会进行对象引用比较 - 即每个 int[] 数组上的引用相等。

更改您的集合断言如下:

CollectionAssert.AreEqual(

    expected, actual, 

    System.Collections.StructuralComparisons.StructuralComparer,

    "\nExpect: " + ... // omitted for brevity

);

并且测试将通过。


如果你只是比较数组,测试框架会做一个零碎的比较,所以这个测试,例如,会通过:


[TestMethod]

public void WillCompareByElement()

{

    var x = new[] { 3, 2 };

    var y = new[] { 3, 2 };


    CollectionAssert.AreEqual(x, y);

}

您可能会得到更清晰的测试失败消息,循环遍历列表的每个元素并以这种方式进行比较。


此外,您可以考虑使用像 Shouldly 这样像样的断言库。然后你可以写:


expected.ShouldBe(actual);

并获得如下输出:


Message: Test method SOTestEquals.UnitTest1.SecondRow threw exception: 

Shouldly.ShouldAssertException: [[5324, 5423, 2345]]

    should be

[[5324, 5432, 2345]]

    but was not

    difference

[*[5324, 5423, 2345]*]

保存您编写自定义输出。


查看完整回答
反对 回复 2021-07-10
  • 1 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信