为什么Assert.AreEqual(T obj1,Tobj2)使用相同的字节数组失败

Dav*_*son 83 c# unit-testing assert

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

    /// <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);
    }
Run Code Online (Sandbox Code Playgroud)

两个数组都是相同的字节.在这种情况下,为什么Assert.AreEqual会失败?

tva*_*son 136

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

  • 当然,数组已经是一个"ICollection".它甚至是一个"IList".重要的是,您的"集合相等"会考虑排序(即集合必须与序列相等,而不仅仅是数学集合). (3认同)
  • 我建议另外看看其他的CollectionAssert方法......我使用这个单元测试框架已经多久了,而且不知道CollectionAssert!我一直在手动做太长时间,感觉非常愚蠢. (2认同)

Jon*_*eet 42

因为数组不会覆盖Equals.

您还没有说过您正在使用哪个测试框架,但基本上它将取决于特殊情况数组的框架.当然,您总是可以实现自己的帮助方法.我有时候这样做了.对于快速而肮脏的黑客攻击,如果您使用的是.NET 3.5,则可以使用Enumerable.SequenceEqual扩展方法:

Assert.IsTrue(actual.SequenceEqual(expected));
Run Code Online (Sandbox Code Playgroud)

当然,自定义帮助程序方法可以为您提供有关它们如何不同的更多详细信息.您可能会发现这些方法MoreLINQ.TestExtensions很有用,尽管它们相当粗糙并且也很准备好.

  • 别忘了添加```使用System.Linq;```让它工作 (2认同)

小智 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));
Run Code Online (Sandbox Code Playgroud)

  • 为什么将 byte[] 转换为字符串进行比较。这是不必要的,想象一下,错误可能出在转换本身,而不是字节 [] (4认同)