You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS单元测试未识别预期与实际结果相等问题求助

问题:VS Unit Test 判定卡普雷卡常数测试用例不相等的解决办法

最近公司要转向TDD开发模式,我正在用VS2013自带的VS Unit Test写卡普雷卡常数的测试代码。现在有个测试用例,传入有效数字5324,预期返回的List<int[]>里包含一个3元素数组[5324, 5423, 2345],调试时看实际返回内容好像符合预期,但Unit Test却判定结果不相等。下面是精简后的代码和测试结果:

单元测试代码

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));
            }
            lstDigits.Sort();
            string dNum = String.Empty;
            for (int ndx = 3; ndx > -1; ndx--)
                dNum = dNum + lstDigits[ndx].ToString();
            row[1] = int.Parse(dNum);
            string aNum = String.Empty;
            for (int ndx = 0; ndx < 4; ndx++)
                aNum = aNum + lstDigits[ndx].ToString();
            row[2] = int.Parse(aNum);
            rtnVal.Add(row);
            return rtnVal;
        }
    }
}

测试结果

测试名称: 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处的元素不匹配。)
结果堆栈跟踪: 在 KaprekarsConstantTest.UnitTest1.FirstRow() 位置 …\Projects\C_Sharp\KaprekarsConstant\KaprekarsConstantTest\UnitTest1.cs:第61行


解决方案

兄弟,你仔细看测试结果里的实际值是5432,但你预期写的是5423,这俩根本不一样啊!估计是调试时没盯紧细节,其实是你的预期值写错了。

5324的数字拆分后是5、3、2、4,降序排列应该是5、4、3、2,组合起来就是5432,不是你写的5423。把测试代码里的row[1] = 5423;改成row[1] = 5432;,测试就能直接通过了。

另外给你个小建议:可以把生成降序、升序数字的代码用LINQ简化一下,不仅更简洁,还能避免手动循环索引时可能犯的小错误:

比如把应用代码里生成降序和升序的部分替换成:

// 生成升序数字
string aNum = string.Concat(lstDigits.OrderBy(d => d));
row[2] = int.Parse(aNum);
// 生成降序数字
string dNum = string.Concat(lstDigits.OrderByDescending(d => d));
row[1] = int.Parse(dNum);

这样代码可读性更高,也不容易出错。

内容的提问来源于stack exchange,提问作者Trebor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:47:37