2011-11-21 30 views
14

Tôi có một số kiểm tra nơi tôi đang kiểm tra tên tham số trong trường hợp ngoại lệ. Làm thế nào để tôi viết điều này trong MS TEST?Khẳng định ngoại lệ từ NUnit đến MS TEST

ArgumentNullException exception = 
       Assert.Throws<ArgumentNullException>(
          () => new NHibernateLawbaseCaseDataLoader( 
               null, 
               _mockExRepository, 
               _mockBenRepository)); 

Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName); 

Tôi đã hy vọng cách neater để tôi có thể tránh sử dụng try catch block trong các bài kiểm tra.

Trả lời

29
public static class ExceptionAssert 
{ 
    public static T Throws<T>(Action action) where T : Exception 
    { 
    try 
    { 
     action(); 
    } 
    catch (T ex) 
    { 
     return ex; 
    } 

    Assert.Fail("Expected exception of type {0}.", typeof(T)); 

    return null; 
    } 
} 

Bạn có thể sử dụng phương pháp mở rộng ở trên làm trình trợ giúp thử nghiệm. Dưới đây là một ví dụ về cách sử dụng nó:

// test method 
var exception = ExceptionAssert.Throws<ArgumentNullException>(
      () => organizations.GetOrganization()); 
Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName); 
+0

như cách làm việc của bạn xung quanh – cpoDesign

+0

trong khối mã thứ hai của bạn sẽ không chính xác hơn để kiểm tra ngoại lệ! = Null? – syclee

+0

Bạn có thể thêm một khối catch khác cho phần còn lại của ngoại lệ và nói, "Ngoại lệ dự kiến ​​là abc nhưng có xyz". – Hash

3

Vì thuộc tính MSTest [ExpectedException] không kiểm tra văn bản trong thư, đặt cược tốt nhất của bạn là thử ... bắt và đặt Assert trên thuộc tính Message/ParamName ngoại lệ.

7

Shameless plug, nhưng tôi đã viết một lắp ráp đơn giản mà làm cho trường hợp ngoại lệ khẳng định và tin nhắn ngoại lệ một chút dễ dàng hơn và dễ đọc hơn trong MSTest sử dụng Assert.Throws() cú pháp theo kiểu nUnit/xUnit.

Bạn có thể tải về các gói từ NuGet sử dụng: PM> Install-Package MSTestExtensions

Hoặc bạn có thể xem mã nguồn đầy đủ ở đây: https://github.com/bbraithwaite/MSTestExtensions

hướng dẫn mức cao, tải về lắp ráp và kế thừa từ BaseTest và bạn có thể sử dụng cú pháp Assert.Throws().

Phương pháp chính cho Ném thực hiện trông như sau:

public static void Throws<T>(Action task, string expectedMessage, ExceptionMessageCompareOptions options) where T : Exception 
{ 
    try 
    { 
     task(); 
    } 
    catch (Exception ex) 
    { 
     AssertExceptionType<T>(ex); 
     AssertExceptionMessage(ex, expectedMessage, options); 
     return; 
    } 

    if (typeof(T).Equals(new Exception().GetType())) 
    { 
     Assert.Fail("Expected exception but no exception was thrown."); 
    } 
    else 
    { 
     Assert.Fail(string.Format("Expected exception of type {0} but no exception was thrown.", typeof(T))); 
    } 
} 

Thông tin thêm here.

+0

@joran Tôi nên thêm, tôi đang chờ câu trả lời thông tin của bạn cho câu hỏi này ... –

+0

Tôi không có gì để cung cấp, nhưng tôi đánh giá cao của bạn! Tôi hy vọng bạn không phạm tội khi nhận xét của tôi. Mặc dù chuyên môn của tôi về SO nằm trong các lĩnh vực chủ đề hoàn toàn khác nhau, tôi cố gắng trả lại trang web bằng cách chỉnh sửa khi tôi có thể và khuyến khích những người như bạn đăng câu trả lời có chất lượng cao hơn. Tất cả đều bổ sung thêm vào một trang web có nguồn tài nguyên quý giá hơn nhiều cho người khác. – joran

+0

@joran Fair đủ :) –

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