2010-03-25 31 views
35

Ai đó có thể cho tôi biết tại sao bài kiểm tra đơn vị này kiểm tra các trường hợp ngoại lệ không thành công? Rõ ràng thử nghiệm thực sự của tôi là kiểm tra mã khác nhưng tôi đang sử dụng Int32.Parse để hiển thị vấn đề.nUnit Assert.That (phương pháp, Throws.Exception) không bắt ngoại lệ

[Test] 
public void MyTest() 
{ 
    Assert.That(Int32.Parse("abc"), Throws.Exception.TypeOf<FormatException>()); 
} 

Kiểm tra không thành công, đưa ra lỗi này. Rõ ràng là tôi đang cố gắng để kiểm tra ngoại lệ này và tôi nghĩ rằng tôi đang thiếu một cái gì đó trong cú pháp của tôi.

Error 1 TestCase '.MyTest' 
failed: System.FormatException : Input string was not in a correct format. 
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) 
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
at System.Int32.Parse(String s) 

dựa trên tài liệu tại Throws Constraint (NUnit 2.5)

+1

Bạn cũng có thể làm điều này: 'Assert.Throws (() => Int32.Parse (" abc "));' – Jaider

+0

Tôi đã cố gắng gắn bó với phong cách Assert.That cho dự án này. Tôi không gắn bó với nó như tôi từng nghĩ. –

Trả lời

52

Hãy thử điều này thay vì:

Assert.That(() => Int32.Parse("abc"), Throws.Exception.TypeOf<FormatException>()); 

Về cơ bản bạn cần phải vượt qua một đại biểu để Assert.That, giống như các tài liệu trong trạng thái liên kết của bạn (lưu ý rằng Tôi đã sử dụng một biểu thức lambda ở đây, nhưng nó sẽ giống nhau).

+1

ah Tôi phải thực hiện trong một đại biểu ẩn danh ... Tôi thấy rằng trong tài liệu bây giờ, nó không phải là siêu rõ ràng. Cảm ơn! –

+3

Khi một người nào đó chạy vào thực tế là hàm ẩn danh của họ trả về void, bạn sẽ cần phải làm một cái gì đó như: 'Assert.That (new Action (() => VoidReturningMethod (" abc ")), Throws.Exception.TypeOf ()); ' –

+0

Cảm ơn @MartinNeal đã giúp tôi trên con đường đúng, nhưng đối với tôi nó phàn nàn rằng nó phải là một TestDelegate, vì vậy tôi phải làm:' new TestDelegate (() => AddBlockingTaskToBox()) ' hoặc là – Brondahl

8

runner thử nghiệm Những gì bạn đang sử dụng? Không phải tất cả chúng đều hoạt động chính xác với các xác nhận ngoại lệ.

Bạn có thể có may mắn hơn sử dụng [ExpectedException (typeof(FormatException))] hoặc thậm chí Assert.Throws<FormatException> (() => Int32.Parse("abc"));

+0

Tôi đã sử dụng TDD.net và nUnit gui. Sửa lỗi của bạn đã hoạt động, nhưng tôi muốn sử dụng cú pháp thông thạo. Tôi đã cho bạn một điểm mặc dù cho sự giúp đỡ! –

+0

Tôi biết đây là câu trả lời cũ đúng lúc đó. Nhưng hiện tại và tham chiếu trong tương lai, thuộc tính 'ExpectedException' không được chấp nhận trên NUnit 3.0: https://github.com/nunit/docs/wiki/Breaking-Changes – ferpega

Các vấn đề liên quan