2012-07-20 22 views
110

Gần đây tôi đã cố gắng sử dụng phương thức Assert.Equals() khi viết một thử nghiệm NUnit mới. Khi thực hiện phương pháp này ném một số AssertionException nói rằng Assert.Equals should not be used for Assertions. Đây là một chút bối rối ngay từ cái nhìn đầu tiên. Những gì đang xảy ra ở đây?Assert.Equals của NUnit ném ngoại lệ "Assert.Equals không nên được sử dụng cho các xác nhận"

+0

Bạn có thể cho chúng tôi một số bối cảnh như các mã đặc biệt rằng đây là là trong? Bạn đã so sánh loại đối tượng nào, v.v ...? –

+9

Xin lỗi, nhưng tôi đã tìm thấy câu trả lời cho câu hỏi này. Tôi chỉ hỏi nó để tôi có thể đăng câu trả lời cho hậu thế. Ngữ cảnh không thực sự quan trọng, như bạn sẽ thấy bằng cách đọc câu trả lời. Tôi hy vọng rằng câu trả lời này sẽ dễ dàng phát hiện được thông qua tìm kiếm trên web trong thông điệp ngoại lệ. – Odrade

+2

+1 cho sự trung thực! – stannius

Trả lời

164

Assert là lớp tĩnh kế thừa từ System.Object, vì tất cả các lớp đều ẩn trong C#. System.Object thực hiện phương thức sau:

static bool Equals(object a, object b) 

Phương pháp trên Assert được dùng để so sánh bình đẳng là các phương pháp Assert.AreEqual(). Do đó, việc gọi phương thức Object.Equals() thông qua lớp Assert trong một bài kiểm tra đơn vị chắc chắn là một sai lầm. Để ngăn chặn sự nhầm lẫn này và tránh nhầm lẫn, các nhà phát triển NUnit đã cố ý ẩn Object.Equals trong lớp Assert với việc triển khai thực hiện ném một ngoại lệ. Dưới đây là việc thực hiện:

/// <summary> 
/// The Equals method throws an AssertionException. This is done 
/// to make sure there is no mistake by calling this function. 
/// </summary> 
/// <param name="a"></param> 
/// <param name="b"></param> 
[EditorBrowsable(EditorBrowsableState.Never)] 
public static new bool Equals(object a, object b) 
{ 
    // TODO: This should probably be InvalidOperationException 
    throw new AssertionException("Assert.Equals should not be used for Assertions"); 
} 

Dĩ nhiên thông điệp ngoại lệ chính nó là khó hiểu, nhưng ít nhất nó cho phép bạn biết bạn đã làm một cái gì đó sai.

+1

giúp tôi tiết kiệm được nhiều giờ đau đầu. – fregas

+12

Thông báo gây nhầm lẫn, nhưng nhập nó vào Google và bạn kết thúc ngay tại đây tại câu trả lời này và tất cả đều tốt. Cảm ơn Odrade. –

+18

Các nhà phát triển của NUnit có thể thay đổi thông điệp để nói "... sử dụng Assert.AreEqual()". – WillC

3

tldr;

Assert.AreEqual(a, b); // <-- Compares a, b 

không:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself 
Các vấn đề liên quan