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"
Trả lời
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.
giúp tôi tiết kiệm được nhiều giờ đau đầu. – fregas
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. –
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
tldr;
Assert.AreEqual(a, b); // <-- Compares a, b
không:
Assert.Equals(a, b); // <-- Irrelevant equality operator on Assert itself
- 1. NUnit Assert.Equals Tôi đang thiếu gì?
- 2. Tôi nên ném loại ngoại lệ nào?
- 3. Sử dụng Interop.MODI Ném 0x80040154 Ngoại lệ
- 4. Xác nhận rằng một hàm ném ngoại lệ với Qunit
- 5. ném mới std :: ngoại lệ vs ném std :: ngoại lệ
- 6. Bối rối về khi nào nên ném một ngoại lệ
- 7. Cách tắt "Ngắt khi ngoại lệ được ném" cho các loại ngoại lệ tùy chỉnh
- 8. MOQ - xác minh ngoại lệ đã được ném
- 9. Trong Java, đang sử dụng ném ngoại lệ thay vì ném nhiều ngoại lệ cụ thể thực hành tốt?
- 10. asp.net mvc 3 nhận ngoại lệ được ném
- 11. Ném ngoại lệ từ các nhà thầu
- 12. Bắt ngoại lệ được ném từ các tệp DLL
- 13. WebAuthenticationBroker.AuthenticateAsync ném ngoại lệ
- 14. Sử dụng ngoại lệ cho loại không khớp trong C#
- 15. recursive_directory_iterator ném ngoại lệ
- 16. LLVM ngoại lệ ném
- 17. BeginInvoke ném ngoại lệ
- 18. TransactionScope ném ngoại lệ
- 19. Sử dụng "TYPE = InnoDB" trong MySQL ném ngoại lệ
- 20. NUnit: thử nghiệm với KHÔNG mong đợi ngoại lệ
- 21. Loại ngoại lệ nào để ném cho các chuỗi
- 22. mã hóa Base64 sử dụng tăng ném ngoại lệ
- 23. Destructor không được gọi khi một ngoại lệ được ném
- 24. C# Ném ngoại lệ khi sử dụng Assert?
- 25. Hiệu suất khi ngoại lệ không được ném (C++)
- 26. HttpWebRequest là ném ngoại lệ cho 404
- 27. C# Ngoại lệ ném lại
- 28. SQL gốc ném Tên cột không hợp lệ Ngoại lệ
- 29. ném ngoại lệ
- 30. Worksheet get_Range ném ngoại lệ
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 ...? –
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
+1 cho sự trung thực! – stannius