2010-01-18 42 views
8

Chúng tôi đã sử dụng NUnit & VisualStudio để viết mã C# .NET trong một thời gian. Kiểm tra ngoại lệ được thực hiện theo phong cách củaExceptionAsserts & debugging dự án C# của bạn trong VS

cú pháp cũ:

[Test] 
[ExpectException(typeof(ExceptionType))] 
public void TestExceptionType() 
{ 

} 

Bây giờ NUnit đã phát hành phiên bản 2.5.2 mà giới thiệu Assert.Throws(Type expectedExceptionType, TestDelegate code); Điều này làm cho ngoại lệ thử nghiệm một toàn bộ rất nhiều linh hoạt hơn. kiểm tra ngoại lệ của chúng tôi bây giờ nhìn như thế này:

cú pháp mới:

[Test] 
public void TestWithNullBufferArgument() 
{ 
    ArgumentNullException ex = Assert.Throws<ArgumentNullException>(() => _testInstance.TestFunction(null)); 

    // now you can examine the exception and it's properties 
    Assert.AreEqual(ex.Message, "Argument was null"); 
} 

vấn đề của chúng tôi là nếu Assert.Throws được sử dụng Visual Studio sẽ ho lên một cửa sổ hiển thị một ngoại lệ unhandled khi NUnit (hoặc giao diện điều khiển hoặc GUI Á hậu) được sử dụng để gỡ lỗi chương trình.

để làm rõ điều này: chúng tôi đã thiết lập dự án VS chứa các kiểm tra đơn vị để chạy nunit-x86.exe khi gỡ lỗi. (Xem thuộc tính dự án, tab gỡ lỗi, bắt đầu hành động được thiết lập để chạy nunit-x86.exe)

Điều này ngăn NUnit tiếp tục thử nghiệm. Có thể tiếp tục gỡ lỗi/thử nghiệm đơn vị bằng cách nhấn F5 nhưng đây không phải là giải pháp khả thi.

Có cách nào để tránh điều này không? Đặt một thử ... bắt khối xung quanh Assert.Throws không có gì vì ngoại lệ xảy ra trong mã đại biểu.

Tôi hy vọng ai đó có thể làm sáng tỏ điều này.

+0

Ví dụ kiểm tra bạn hiển thị không tuân theo cú pháp bạn hiển thị. Ngoài ra, những gì bạn có nghĩa là "khi NUnit ... được sử dụng để gỡ lỗi chương trình?" Bạn có nghĩa là bạn chỉ đang chạy thử nghiệm, hoặc là bạn chạy thử nghiệm trong trình gỡ lỗi (tôi biết TestDriven.NET có thể làm điều này, không biết về các NUNit runners)? – Jay

+0

Xin chào Jay! Xin lỗi vì sự nhầm lẫn. Có hai loại cú pháp khác nhau được hiển thị: mới và cũ. Chúng ta đã chuyển từ cú pháp cũ sang cú pháp mới, bây giờ sử dụng ràng buộc Assert.Throws <>. Chúng tôi đang chạy thử nghiệm trong các trình gỡ rối, nó đã hoạt động tốt cho đến nay và rất dễ dàng để xem những gì đang xảy ra vì VS sẽ chuyển thẳng đến điểm xảy ra ngoại lệ. Với cú pháp mới, chúng tôi nhận được tất cả các kiểm tra ngoại lệ là "sai tích cực", với cú pháp cũ chỉ có ngoại lệ thực sự sẽ làm gián đoạn việc thực thi. –

Trả lời

7

Sự cố tự xuất hiện vì hầu như bạn có tùy chọn Bật Chỉ mã của tôi được bật (Tools-> Options-> Debugging-> General-> Enable Just My Code).

"Khi tính năng này được bật, trình gỡ lỗi chỉ hiển thị và các bước vào mã người dùng (" Mã của tôi "), bỏ qua mã hệ thống và mã khác được tối ưu hóa hoặc không có biểu tượng gỡ lỗi" (xem "General, Debugging, Options Dialog Box")

Thông thường bạn có một phiên bản phát hành của nunit.framework.dll không có tệp nunit.framework.pdb tương ứng.

Vì vậy, có 2 lựa chọn:

  1. Disable "Just My Code" tính năng

  2. Tải nguồn nunit (từ http://www.nunit.org/index.php?p=download), xây dựng chúng trong chế độ debug, đặt tất cả nunit.framework. * (dll, pdb, xml) vào thư mục lib hoặc thư mục khác trong giải pháp của bạn và tham khảo nunit.framework.dll trong dự án thử nghiệm của bạn.

Hy vọng điều này sẽ hữu ích.

+0

dh, đây là một dòng suy nghĩ thú vị. Tôi đã thử tùy chọn 1 (chỉ vì nó nhanh chóng và tôi đã không có thời gian để thử số 2) và tiếc là nó đã không làm cho bất kỳ sự khác biệt cho tôi. Nếu bây giờ tôi nhận được nhiều ngoại lệ chưa được giải quyết. Vấn đề với Assert.Throws <> gây ra một ngoại lệ chưa được giải quyết vẫn còn đó. –

+0

Tôi không biết. Điều đó nghe có vẻ như thiết lập của tôi ngoại trừ việc tôi đang gọi nunit-gui.exe –

+0

Tôi đã thử điều đó với nunit-gui với kết quả tương tự như đối với nunit-console. Vẫn còn có một tùy chọn với việc cung cấp các biểu tượng gỡ lỗi, hy vọng rằng sẽ làm việc cho bạn. –

-1

Có thể đạt được điều này bằng cách vô hiệu hóa Ngoại lệ. Mở menu Gỡ lỗi/Ngoại lệ và tìm kiếm Ngoại lệ của bạn.

+0

Điều này hoạt động nhưng nó cũng có nghĩa là không có trường hợp ngoại lệ sẽ bị bắt nếu gỡ lỗi chương trình thực sự và không phải kiểm tra đơn vị. Lý tưởng nhất là chúng tôi đang tìm kiếm một cách làm thế nào để tránh nó khi gỡ lỗi các bài kiểm tra đơn vị. Cảm ơn gợi ý, đó có thể là một giải pháp có thể chấp nhận được nếu không có gì khác xuất hiện. –

+0

nếu bạn viết hai bài kiểm tra đơn vị thì sao? một trong những chắc chắn rằng ngoại lệ được ném, thứ hai sẽ thực hiện việc thực hiện? –

+0

Tôi mặc dù về điều đó là tốt.Thật không may nó không hoạt động như là ngoại lệ được ném bởi các mã trong đại biểu và Assert.Throws <> là mong đợi ngoại lệ được ném. –

1

Tôi nghĩ rằng bạn đang bị mù bởi xác nhận NUnit. Bạn có thể đạt được điều tương tự với một thử/nắm bắt đơn giản.

try 
{ 
    _testInstance.TestFunction(null); 
    Assert.Fail("The method should have thrown..."); 
}catch{} 

Bây giờ, bạn có mọi thứ bạn cần. Bạn thất bại nếu ngoại lệ không được ném và mã thông thường của bạn có thể xử lý các ngoại lệ như mong đợi.

+0

Bạn nói đúng, đây sẽ là cách cơ bản để xử lý các ngoại lệ trong thử nghiệm đơn vị. Vẻ đẹp của ngoại lệ NUnit khẳng định mặc dù là bạn có thể kiểm tra các thuộc tính nhất định của ngoại lệ đã được ném. Ví dụ: bạn có thể kiểm tra xem thông số đã được chuyển đến ngoại lệ có đúng không. Tôi thích và sử dụng nó và tôi muốn giữ nó. –

+0

Bạn sẽ không thể kiểm tra các tham số của ngoại lệ theo cách này? Thay vì bắt {} bạn có thể nói bắt (Exception ex) {Assert.IsTrue (ví dụ: Whatever); } – Phil

+0

Vâng, đó thực sự là sự thật. Đẹp và đơn giản, tôi thích nó! Câu hỏi ban đầu của tôi là về vấn đề mà phương thức Assert.Throws <> gây ra, do đó tôi đã trao tiền thưởng cho một người đã giải quyết vấn đề trước mắt. –

2

Vấn đề tương tự cũng khó chịu với tôi trong một thời gian khá lâu, tôi đã làm một vài kiểm tra và tìm thấy những điều sau đây:

Nếu một thư viện (nunit trong trường hợp này) được biên soạn với thông tin gỡ lỗi thiết lập để 'không', sau đó nếu xây dựng tương tự như dưới đây được thực hiện với thư viện và mã của đại biểu ném một ngoại lệ, sau đó VS ngừng phàn nàn về ngoại lệ không được xử lý bởi mã người dùng.

đang Thư viện:

public static Exception Throws(TestDelegate code, string message) 
{ 
    Exception caughtException = null; 

    try 
    { 
     code(); 
    } 
    catch (Exception ex) 
    { 
     caughtException = ex; 
    }   

    return caughtException; 
} 

Khách hàng mã:

private void btnTest_Click(object sender, EventArgs e) 
{ 
    var ex = MyAssert.Throws(() => { throw new Exception(); }, "");  
} 

Cài đặt thông tin debug của một dự án thư viện để bất kỳ tùy chọn nào khác ngoài 'không' giải quyết các debugger vấn đề tức là không chỉ dừng lại nữa trên những trường hợp ngoại lệ "không được giải quyết" đó. Tôi đã thử nghiệm nó với nunit và thư viện cuộn bằng tay của riêng tôi với đoạn mã trên (lấy một đoạn từ phương thức ném của nunit). Tôi cho rằng đó là một tính năng hoặc một "tính năng" của VS.

Đó lá chúng tôi với không quá nhiều lựa chọn:

  1. Lọc ngoại lệ như trước đây gợi ý

  2. biên dịch lại nunit.framework.dll để sử dụng trong nước, để tránh những điểm dừng gây phiền nhiễu

Các tùy chọn khác có thể là liên hệ với nhóm MS hoặc NUnit hoặc cả hai và yêu cầu họ điều tra/làm rõ vấn đề và biên dịch NUnit với mức thông tin gỡ lỗi tối thiểu tôn trọng.

Chỉnh sửa:

Tìm thấy một tùy chọn khác.

  1. Trong trường hợp bỏ chọn 'Suppress JIT optimization on load module' cũng thực hiện thủ thuật, ngay cả khi các thư viện được biên soạn không có thông tin gỡ lỗi. Tuy nhiên nó chỉ hoạt động khi dự án được chạy trong cấu hình phát hành.
+0

dyadenka, cảm ơn rất nhiều thông tin phản hồi chi tiết! Thật không may dh đã đưa ra đề nghị tương tự (biên dịch lại khung nunit trong cấu hình gỡ lỗi) một chút trong khi trước để anh ta nhận được tiền thưởng. Tôi đã viết cho danh sách gửi thư nunit về vấn đề này vì vậy chúng tôi sẽ nếu họ đưa ra một giải pháp tốt hơn. –

+0

Không phải lo lắng, tiền thưởng không nhằm mục đích, mục tiêu chính là giải quyết vấn đề của những điểm dừng gây phiền nhiễu trong VS. – Dyadenka

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