2013-04-11 39 views
7

Tôi có một tình huống thực sự kỳ lạ khi sử dụng khung kiểm thử đơn vị Visual Studio. Thử nghiệm được trang trí là [TestMethod, ExpectedException(typeof(InvalidOperationException))]không thành công với System.InvalidOperationException.Thuộc tính ExpectedException không hoạt động

Nếu tôi xóa tất cả mã khỏi thử nghiệm (để đảm bảo nó không hề ném bất kỳ thứ gì) - nó sẽ chuyển. Nó giống như là ExpectedException thậm chí không có ở đó ...

Nếu tôi bắt đầu một dự án trống với thử nghiệm giả không có gì ngoài việc ném InvalidOperationException nó hoàn toàn hoạt động như mong đợi.

Xác minh rằng không phải ExpectedExceptionAttribute cũng không phải InvalidOperationException bị ghi đè. Không chắc chắn những gì khác để thử đây ...


EDIT: Cố định các vấn đề bằng cách loại bỏ tham chiếu đến Microsoft.VisualStudio.QualityTools.UnitTestFramework v10.1 và v10.0 thêm. Không chắc tại sao điều này lại quan trọng hoặc tại sao các thuộc tính khác hoạt động tốt.

+0

Nếu trong dự án vấn đề của bạn, bạn loại bỏ tất cả các mã từ các thử nghiệm và chỉ cần thêm một dòng để ném InvalidOperationException, mà làm việc như mong đợi (tức là đi mặc dù nó ném một ngoại lệ?) –

+0

@MattSmith Không, kiểm tra không thành công. –

+0

Vấn đề thú vị, tìm kiếm thú vị. – Eogcloud

Trả lời

3

Cá nhân tôi không sử dụng thuộc tính ExpectedExeption vì nó không cho phép bạn chỉ định chính xác câu lệnh nào được dự kiến ​​sẽ ném ngoại lệ. Ví dụ, có thể có một số vấn đề trong mã thiết lập thử nghiệm của bạn mà ném một InvalidOperationExeption mà không được phát hiện trong thử nghiệm của bạn và đột nhiên thử nghiệm của bạn vượt qua. Hơn nữa nó không cho phép bạn kiểm tra Exeception, như Asserting nó có thông điệp chính xác.

tôi sử dụng phương pháp sau đây

[TestMethod] 
public void Test() 
{ 
    //Arrange 
    var sut = new ClassToTest(); 
    sut.MethodThatShouldNotThrow(); 

    //Act 
    try 
    { 
     sut.MethodToTestThatShuldThrow(); 
    } 
    catch(InvalidOperationException ioex) 
    { 
     //Assert, here you could do additional Asserts on the Exception's properties  
     return; 
    } 
    Assert.Fail("Expected InvalidOperationException was not thrown"); 
} 
Các vấn đề liên quan