2009-09-03 22 views
77

Tôi có hai mảng byte giống hệt nhau trong phân khúc mã sau đây:Tại sao Assert.AreEqual (T obj1, Tobj2) thất bại với mảng byte giống hệt

/// <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); 
    } 

Cả hai mảng là giống hệt nhau xuống byte rất. Trong kịch bản này, tại sao Assert.AreEqual lại thất bại?

+1

Là một lưu ý, nếu bạn sử dụng NUnit, so sánh giá trị của mảng được hỗ trợ từ phiên bản 2.2, vì vậy 'Assert.AreEqual' sẽ hoạt động tốt. –

Trả lời

123

Assert.Equals thử nghiệm sử dụng phương pháp Equals, theo mặc định sử dụng bình đẳng tham chiếu và vì chúng là các đối tượng khác nhau nên chúng không bằng nhau. Bạn sẽ muốn so sánh từng byte trong mảng và xác minh rằng chúng bằng nhau. Một cách để làm điều này là chuyển đổi chúng thành một cái gì đó thực hiện ICollection và sử dụng CollectionAssert.AreEqual() thay thế.

+2

yup, đã làm các trick. cảm ơn! –

+3

Một mảng đã là một 'ICollection', tất nhiên. Nó thậm chí là một 'IList'. Điều quan trọng là "bình đẳng thu thập" của bạn cân nhắc việc đặt hàng (nghĩa là các bộ sưu tập phải bằng các chuỗi, không chỉ là các bộ toán học). –

+0

Câu trả lời này là sai! "Assert.AreEqual kiểm tra objectOne.Equals (objectTwo) sẽ trả về true." (xem http://blog.robustsoftware.co.uk/2009/05/difference-between-areequal-and-aresame.html). Nếu bạn muốn kiểm tra sự bình đẳng tham chiếu, bạn phải sử dụng Assert.AreSame(). Đầu ra của Assert.AreEqual() phụ thuộc hoàn toàn vào kiểu đối tượng. – user1027167

35

Vì mảng không ghi đè Equals.

Bạn chưa cho biết bạn đang sử dụng khung kiểm tra nào, nhưng về cơ bản nó sẽ phụ thuộc vào khuôn khổ đó vào các mảng đặc biệt. Bạn luôn có thể thực hiện phương pháp trợ giúp của riêng bạn để làm điều đó, tất nhiên. Tôi đã làm điều đó đôi khi. Đối với một hack nhanh chóng và dơ bẩn, nếu bạn đang sử dụng .NET 3.5 bạn có thể sử dụng phương pháp Enumerable.SequenceEqual mở rộng: Phương pháp helper

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

Một tùy chỉnh có thể cung cấp cho bạn biết thêm chi tiết về làm thế nào chúng khác nhau, tất nhiên. Bạn có thể tìm thấy các phương thức trong MoreLINQ.TestExtensions hữu ích, mặc dù chúng khá thô và sẵn sàng.

+0

Tôi đang sử dụng các bài kiểm tra đơn vị VSTS. Có một khẳng định thay thế được xây dựng trong tôi có thể sử dụng, hoặc làm một for-loop và so sánh các byte, nếu tất cả chúng đều bằng nhau, sau đó khẳng định? –

+0

Tôi e là tôi chưa sử dụng các bài kiểm tra đơn vị VSTS - nhưng đề xuất của tvanfosson có vẻ phù hợp. –

+0

Câu trả lời của anh ấy rất tuyệt vời, cảm ơn Jon! –

2

Phương thức Assert.AreEqual dưới mui xe sẽ kết thúc mặc định là Object.Equals() cho các giá trị không null. Việc thực thi mặc định của Object.Equals() là bình đẳng tham chiếu. Hai mảng có giá trị giống hệt nhau nhưng tham chiếu khác biệt khôn ngoan và do đó sẽ không được coi là bình đẳng.

2
//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

Tại sao chuyển đổi byte [] thành chuỗi để so sánh. Nó là không cần thiết và, hãy tưởng tượng, lỗi có thể được chuyển đổi chính nó, không phải là byte [] –

0
byte[] a = new byte[] {x, y, z...}; 
byte[] b = new byte[] {x, y, z...}; 
assertArrayEquals(a , b); 

sẽ so sánh những thứ ... Nó làm việc cho tôi ..

0

tạo phương pháp helper đơn giản:

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]); 
    } 
} 
Các vấn đề liên quan