87

我在以下代码段中有两个相同的字节数组:

    /// <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 会失败?

4

6 回答 6

145

Assert.Equals使用该Equals方法进行测试,该方法默认使用引用相等,并且由于它们是不同的对象,因此它们不相等。您需要比较数组中的每个字节并验证它们是否相等。一种方法是将它们转换为实现 ICollection 并使用CollectionAssert.AreEqual()的东西。

于 2009-09-03T18:36:39.920 回答
49

因为数组不会覆盖Equals.

你还没有说你正在使用哪个测试框架,但基本上它取决于那个框架来处理特殊情况的数组。当然,您总是可以实现自己的辅助方法来做到这一点。我有时会这样做。对于快速而肮脏的 hack,如果您使用的是 .NET 3.5,则可以使用Enumerable.SequenceEqual扩展方法:

Assert.IsTrue(actual.SequenceEqual(expected));

当然,自定义辅助方法可以为您提供有关它们之间差异的更多详细信息。您可能会发现这些方法MoreLINQ.TestExtensions很有帮助,尽管它们也相当粗糙且准备就绪。

于 2009-09-03T18:35:38.457 回答
5
//Initialize your arrays here
byte[] array1 = new byte[0];
byte[] array2 = new byte[0];

Assert.AreEqual(System.Convert.ToBase64String(array1),
                System.Convert.ToBase64String(array2));
于 2012-02-28T15:42:32.163 回答
2

底层的 Assert.AreEqual 方法最终将默认为 Object.Equals() 用于非空值。Object.Equals() 的默认实现是引用相等。这两个数组在值方面是相同的,但在参考方面是不同的,因此不会被认为是相等的。

于 2009-09-03T18:37:55.190 回答
0

创建了简单的辅助方法:

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]);
    }
}
于 2017-02-27T14:10:34.543 回答
-1
byte[] a = new byte[] {x, y, z...};
byte[] b = new byte[] {x, y, z...};
assertArrayEquals(a , b );

会比较这些东西......它对我有用..

于 2015-04-25T06:07:41.373 回答