是Assert.AreEqual <byte []>(一,二);比较对象或值

时间:2016-05-27 13:01:28

标签: c# unit-testing

为什么T不能是一个字节[]? 请参阅https://msdn.microsoft.com/de-de/library/ms243446.aspx

上的说明
        byte[] one = { 0x1, 0x2, 0x3, 0x4, 0x5 };
        byte[] two = { 0x1, 0x2, 0x3, 0x4, 0x5 };

        //don't fail
        Assert.AreEqual(Convert.ToBase64String(one), Convert.ToBase64String(two));
        //fail
        Assert.AreEqual<byte[]>(one, two);

3 个答案:

答案 0 :(得分:14)

您正在比较一个字节数组具有引用相等性与另一个字节数组(即两个变量指向同一个数组),在这种情况下它们不会。

更好的方法是使用SequenceEqual进行测试:

Assert.IsTrue(one.SequenceEqual(two));

答案 1 :(得分:2)

那么,

  Assert.AreEqual<T>(one, two);

在比较时使用T.Equals()。因为数组不会覆盖 Equals

  byte[] one = { 0x1, 0x2, 0x3, 0x4, 0x5 };
  byte[] two = { 0x1, 0x2, 0x3, 0x4, 0x5 };

  if (one.Equals(two))
    Console.Write("Yes");
  else
    Console.Write("No"); // <- you'll have this

你会有意想不到的结果。如果Equals未被覆盖,则Object.Equals会比较引用,而不是,而onetwo的引用是不同。如果你想要比较数组&#39;项目,请使用SequenceEqual

答案 2 :(得分:0)

要回答标题中的问题,请执行以下操作:

Assert.AreEqual<byte[]>(one, two);

请参考比较,因为您正在比较两个数组。

要比较内容,请执行@RB。提到并使用SequenceEqual