我在以下代码段中有两个相同的字节数组:
/// <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会失败?
答案 0 :(得分:134)
Assert.Equals
使用Equals
方法进行测试,默认情况下使用引用相等性,因为它们是不同的对象,所以它们不相等。您需要比较数组中的每个字节并验证它们是否相等。一种方法是将它们转换为实现ICollection的东西并改为使用CollectionAssert.AreEqual()。
答案 1 :(得分:41)
因为数组不会覆盖Equals
。
你还没有说过你正在使用哪个测试框架,但基本上它将取决于特殊情况数组的框架。当然,您总是可以实现自己的帮助方法。我有时候这样做了。对于快速而肮脏的黑客攻击,如果您使用的是.NET 3.5,则可以使用Enumerable.SequenceEqual
扩展方法:
Assert.IsTrue(actual.SequenceEqual(expected));
当然,自定义帮助程序方法可以为您提供有关它们如何不同的更多详细信息。您可能会发现MoreLINQ.TestExtensions
中的方法很有帮助,尽管它们相当粗糙且准备就绪。
答案 2 :(得分:4)
//Initialize your arrays here
byte[] array1 = new byte[0];
byte[] array2 = new byte[0];
Assert.AreEqual(System.Convert.ToBase64String(array1),
System.Convert.ToBase64String(array2));
答案 3 :(得分:2)
Assert.AreEqual方法将最终默认为Object.Equals()以获取非空值。 Object.Equals()的默认实现是引用相等。 2个数组是相同的值,但参考不同,因此不会被认为是相等的。
答案 4 :(得分:0)
byte[] a = new byte[] {x, y, z...};
byte[] b = new byte[] {x, y, z...};
assertArrayEquals(a , b );
将比较这些东西......它对我有用..
答案 5 :(得分: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]);
}
}