VS单元测试未识别预期与实际结果相等问题求助
最近公司要转向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

