考虑一下这个功能:
public static ulong[] productFib(ulong prod)
{
ulong fib1 = 0;
ulong fib2 = 1;
while ((fib1 * fib2) < prod)
{
ulong temp = fib1;
fib1 = fib2;
fib2 = temp + fib2;
}
return new ulong[] { fib1, fib2, 1 };
}
我正在研究一个kata,其测试结果如下:
ulong[] r = new ulong[] { 55, 89, 1 };
Assert.AreEqual(r, Kata.productFib(4895));
在即时窗口中,我可以看到返回数组不仅是ulong
类型,而且还有我期望的3个元素,但是MSTest失败了:
Message: Assert.AreEqual failed. Expected:<System.UInt64[]>. Actual:<System.UInt64[]>.
测试断言或我的函数是否有问题导致此测试失败?
谢谢
答案 0 :(得分:3)
Assert.AreEqual()
使用传递参数的Equals()
方法。数组只是比较他们的引用,而不是他们的内容。因此,两个不同的数组实例将永远不会通过此测试。
你可以像这样使用linq SequenceEqual
:
Assert.IsTrue(r.SequenceEqual(Kata.productFib(4895)));
答案 1 :(得分:0)
C#数组是引用类型。 Assert.AreEqual()
将检查引用相等性,而不是您是否传递了值类型。