Assert.Equals của NUnit ném ngoại lệ Assert.Equals không nên được sử dụng để khẳng định


132

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


Bạn có thể cung cấp cho chúng tôi một số bối cảnh như mã cụ thể mà đây là trong? Những loại đối tượng bạn đã so sánh, vv?
Mike Parkhill

9
Xin lỗi, nhưng tôi đã tìm thấy câu trả lời cho điều này. Tôi chỉ hỏi nó để tôi có thể đăng câu trả lời cho hậu thế. Bối 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 được tìm thấy thông qua tìm kiếm trên web trên thông báo ngoại lệ.
Odrade

Câu trả lời:


201

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

static bool Equals(object a, object b)

Các phương thức trên Assert được dự định để so sánh bằng là các Assert.AreEqual()phương thức. Do đó, việc gọi Object.Equals()phương thức 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 ngừa lỗi này và tránh nhầm lẫn, các nhà phát triển của NUnit đã cố tình ẩn Object.Equalstrong lớp Assert với một triển khai đưa ra một ngoại lệ. Đây là cách 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");
 }

Tất nhiên bản thân thông báo ngoại lệ là khó hiểu, nhưng ít nhất nó cho bạn biết bạn đã làm gì đó sai.


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

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

Tại sao họ không làm cho phương thức Equals riêng tư thay thế?
shytikov

4
@shytikov Vì điều đó là không thể. Bạn không thể ghi đè một phương thức ảo từ một lớp cơ sở bằng một phương thức riêng tư.
Odrade

18

tldr;

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

không phải:

Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.