Tôi hoàn toàn mới ở C# và NUnit.Là cách duy nhất của ExpitExceptionAttribute chỉ để kiểm tra nếu một cái gì đó làm tăng một ngoại lệ?
Trong Boost.Test có một họ gồm BOOST_*_THROW
macro. Trong mô-đun thử nghiệm của Python có phương pháp TestCase.assertRaises
.
Theo tôi hiểu, trong C# với NUnit (2.4.8), phương pháp duy nhất thực hiện kiểm tra ngoại lệ là sử dụng ExpectedExceptionAttribute
.
Tại sao tôi nên thích ExpectedExceptionAttribute
hơn - giả sử - cách tiếp cận của Boost.Test? Lý do gì có thể đứng sau quyết định thiết kế này? Tại sao điều đó tốt hơn trong trường hợp của C# và NUnit?
Cuối cùng, nếu tôi quyết định sử dụng ExpectedExceptionAttribute
, làm thế nào tôi có thể làm một số xét nghiệm bổ sung sau khi ngoại lệ được nâng lên và đánh bắt? Hãy nói rằng tôi muốn kiểm tra yêu cầu nói rằng đối tượng phải có giá trị sau khi một số setter nêu ra System.IndexOutOfRangeException
. Bạn sẽ sửa mã sau đây như thế nào để biên dịch và hoạt động như mong đợi?
[Test]
public void TestSetterException()
{
Sth.SomeClass obj = new SomeClass();
// Following statement won't compile.
Assert.Raises("System.IndexOutOfRangeException",
obj.SetValueAt(-1, "foo"));
Assert.IsTrue(obj.IsValid());
}
Edit: Cảm ơn câu trả lời của bạn. Hôm nay, tôi đã tìm thấy Đó là Bài kiểm trablog entry trong đó tất cả ba phương pháp được mô tả bởi bạn được đề cập (và một biến thể nhỏ hơn). Đó là sự xấu hổ mà tôi không thể tìm thấy nó trước khi :-(
Sẽ không Assert.Fail ("...") đổ bạn ra khỏi thử nghiệm với một AssertionFailedException? –
Có. Tuy nhiên, nếu cuộc gọi đến SetValueAt ném một ngoại lệ (mà chúng ta muốn xảy ra), điều khiển ngay lập tức di chuyển đến khối catch và bỏ qua Assert.Fail, do đó vượt qua bài kiểm tra. Nếu SetValueAt không ném ngoại lệ, thì hành vi không phải là ngoại lệ và thử nghiệm sẽ thất bại. – yfeldblum
Đó là neater hơn cách của tôi để làm điều đó. Tôi sẽ sử dụng cách tiếp cận của bạn trong tương lai :) –