为什么Assert.AreEqual(T obj1,Tobj2)以相同的字节数组失败
在下面的代码段中有两个相同的字节数组:
/// <summary> ///A test for Bytes ///</summary> [TestMethod()] public void BytesTest() { byte[] bytes = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketData); TransferEventArgs target = new TransferEventArgs(bytes); byte[] expected = Encoding.UTF8.GetBytes(Properties.Resources.ExpectedPacketValue); byte[] actual; actual = target.Bytes; Assert.AreEqual(expected, actual); }
两个数组都是相同的,直到字节。 在这种情况下,为什么Assert.AreEqual失败?
使用Equals
方法的Assert.Equals
testing,默认情况下使用引用相等性,因为它们是不同的对象,所以它们是不相等的。 您将要比较数组中的每个字节并validation它们是否相等。 一种方法是将它们转换为实现ICollection并使用CollectionAssert.AreEqual()的方法 。
因为数组不会覆盖Equals
。
你还没有说过你正在使用哪个testing框架,但基本上这个框架是由特殊数组组成的。 当然,你总是可以实现你自己的辅助方法来做到这一点。 我有时候做过。 如果你使用.NET 3.5,你可以使用Enumerable.SequenceEqual
扩展方法:
Assert.IsTrue(actual.SequenceEqual(expected));
当然,一个自定义的辅助方法可以给你更详细的信息。 您可能会发现MoreLINQ.TestExtensions
的方法很有帮助,虽然它们相当粗糙,也已经准备就绪。
下面的方法Assert.AreEqual将最终默认为Object.Equals()为非空值。 Object.Equals()的默认实现是引用相等。 这两个数组是相同的值明智的,但不同的参考明智,因此将不被视为相等。
//Initialize your arrays here byte[] array1 = new byte[0]; byte[] array2 = new byte[0]; Assert.AreEqual(System.Convert.ToBase64String(array1), System.Convert.ToBase64String(array2));
byte[] a = new byte[] {x, y, z...}; byte[] b = new byte[] {x, y, z...}; assertArrayEquals(a , b );
将比较的东西…它适用于我..
创build简单的帮手方法:
private static void CompareArrays<T>(T[] expected, T[] actual) { Assert.AreEqual(expected == null, actual == null, "Expected {0}null value and {1}null found.", expected == null ? "" : "not", actual == null ? "" : "not"); if (expected == null || actual == null) return; Assert.AreEqual(expected.LongLength, actual.LongLength, "Expected Length is {0} actual: {1}", expected.LongLength, actual.LongLength); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], "Values on index {0} are not equal. Expected {1} actual: {2}", i, expected[i], actual[i]); } }