2011-11-03 64 views
11

Tôi thường sử dụng Nunit nhưng trong dự án hiện tại của tôi, tôi đang sử dụng MSTest. Bây giờ tôi có một bài kiểm tra dự kiến ​​một ngoại lệ nhưng vẫn không thành công, và tôi không có bất kỳ ý tưởng nào về lý do tại sao.MSTest ExpectedException thất bại

Dưới đây là một ví dụ đơn giản, tôi đã sử dụng để tái tạo các vấn đề:

[TestMethod, ExpectedException(typeof(ErrorResponseException))] 
     public void should_throw_exception() 
     { 
      throw new ErrorResponseException(); 
     } 

Các ErrorResponseException là một lớp học mà chỉ được thừa hưởng từ ngoại lệ, đó là nó, ai biết tại sao điều này là không, tôi mong chờ nó vượt qua.

Trả lời

14

Trong NUnit, tôi sẽ tránh ExpectedException và sử dụng Assert.Throws (Exception Asserts) để thay thế. Nó cung cấp cho bạn kiểm soát tốt hơn. Nếu không, kiểm tra sẽ vượt qua nếu bất kỳ phần nào của phương pháp thử nghiệm ném ra ngoại lệ đó.

Trong MSTest, bạn có thể nhận được cùng một mức độ kiểm soát với xây dựng trường học cũ:

try 
{ 
    // code that you expect to throw goes here 
    Assert.Fail("Expected MyException"); 
} 
catch (MyException ex) 
{ 
    // optionally assert on the message - this can make tests fragile though 
} 

Với điều này, không có nhu cầu sử dụng thuộc tính ExpectedException.

(khái niệm này xuất phát từ cuốn sách Test-Driven Development: Hướng dẫn thực hành bởi David Astels.)

+0

Trong kịch bản thật của tôi nó rất giống với những gì bạn nói để làm cho nó đi vào lúc này, tôi chỉ tìm thấy nó lẻ rằng nó không hoạt động trong MSTest. Sẽ tiếp tục sử dụng thực hành này sau đó. – Grofit

+3

MSTest không hỗ trợ điều này đúng cách, một lỗi của nó. Nó cũng là siêu què! Cách giải quyết ở trên sẽ hoạt động tuy nhiên –

3

Shameless plug, nhưng tôi đã viết một lắp ráp đơn giản mà làm cho khẳng định cho trường hợp ngoại lệ và các thông điệp ngoại lệ một chút dễ dàng hơn và nhiều hơn nữa có thể đọc được trong MSTest bằng cách sử dụng cú pháp Assert.Throws(). Tôi đã viết một số blog post với đầy đủ chi tiết.

3

Nếu bạn đang sử dụng MSTest 10.0.1.0.0, ExpectedException dường như không hoạt động chính xác, hãy sử dụng 10.0.0.0.0 thay thế.

+1

Đúng. Tôi đang đối mặt với vấn đề này ngay bây giờ. – orange

2

Tôi vừa gặp sự cố tương tự và tìm thấy giải pháp khác. Phương pháp của tôi để kiểm tra là async, nhưng tôi quên await từ khóa infront của cuộc gọi trong testmethod của tôi.

Các thử nghiệm:

[TestMethod] 
    [ExpectedException(typeof(InvalidOperationException))] 
    public async Task ShouldDoSomething(){ 
     // notice the missing await in the next line 
     this.testObject.DoSomethingAsync(); 
    } 

Phương pháp để kiểm tra:

 public async Task<bool> DoSomethingAsync(){ 
      if(something) 
      { 
       throw new InvalidOperationException("Error while doing something"); 
      } 
      return false; 
     } 

Khi tôi chạy thử nghiệm của tôi như thế này nó thất bại. Nhưng ngay sau khi tôi thay đổi Kiểm tra thành những điều sau đây:

[TestMethod] 
[ExpectedException(typeof(InvalidOperationException))] 
public async Task ShouldDoSomething(){ 
    await this.testObject.DoSomethingAsync(); 
} 

nó làm việc cho tôi.

0

ExpectedExceptionAttribute giờ được định nghĩa trong nhiều DLL và đơn vị thử nghiệm đơn vị có thể mong đợi để xem thuộc tính từ một DLL khác với dự án thử nghiệm của bạn đang sử dụng.

Ví dụ, tôi đã tạo một dự án thử nghiệm đơn vị trong VS2017 và nó được ExpectedException từ Microsoft.VisualStudio.TestPlatform.TestFramework V14.0.0.0 - kiểm tra vượt qua trong IDE nhưng không thành công trong TeamCity, ngay cả khi sử dụng VSTest runner trên phiên bản 2017.

Cuối cùng tôi đã vượt qua TeamCity bằng cách xóa tất cả các tham chiếu đến DLL này trong các dự án thử nghiệm của tôi và thay thế chúng bằng phiên bản 10.0.0.0 của Mirosoft.VisualStudio.QualityTools.UnitTestFramework

1

Trong Visual Studio 15 với phụ thuộc vào MSTest.TestAdapter v1.1.18MSTest.TestFramework v1.1.18 bạn cũng có thể sử dụng

Assert.ThrowsException<ArgumentNullException>(() => MethodThatThrowsArgumentNullException());

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