2016-01-28 14 views
17

Làm cách nào để kiểm tra ngoại lệ trong một TestCase với NUnit3?Kiểm tra các ngoại lệ với thuộc tính [TestCase] ​​trong NUnit 3?

Hãy nói rằng tôi có một phương pháp Divide(a,b) quy định như sau:

public double Divide(double a, double b) 
{ 
    if(Math.Abs(b) < double.Epsilon) throw new ArgumentException("Divider cannot be 0"); 
    return a/b; 
} 

Tôi muốn thử nghiệm phương pháp này sử dụng NUnit 3,0 trường hợp thử nghiệm, vì vậy có lẽ tôi có:

[TestCase(-10, 2, -5)] 
[TestCase(-1, 2, -0.5)] 
public void TestDivide(double a, double b, double result) 
{ 
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result)); 
} 

Có cách để xác định một trường hợp thử nghiệm mà sẽ gây ra Divide() để ném một ArgumentException và bằng cách nào đó có điều này như là kết quả mong đợi, ví dụ cái gì đó dọc theo dòng:

[TestCase(-10, 2, -5)] 
[TestCase(-1, 2, -0.5)] 
[TestCase(-1, 0, ExpectedResult = TypeOf(ArgumentException)] 
public void TestDivide(double a, double b, double result) 
{ 
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result)); 
} 

(Tất nhiên tôi có thể xác định một phương pháp thử nghiệm riêng biệt và sử dụng Assert.Throws() trong này, vì vậy đây là thuần túy vì tò mò)

Trả lời

20

ExpectedException sẽ là phương pháp chính xác cho NUnit 2.X, nhưng nó đã được gỡ bỏ khỏi NUnit 3.

Có một số đoạn thảo luận khác nhau trong nhóm NUnit Google Group và nhóm tương đương - nhưng có vẻ như quyết định được đưa ra là mẫu thiết kế tốt hơn để kiểm tra kết quả mong đợi và ngoại lệ trong các phương pháp riêng biệt. (link)

Cách duy nhất để thực hiện điều này trong NUnit 3, là chia nhỏ nó thành hai thử nghiệm riêng biệt. (Như nhận xét trong một câu hỏi tương tự đã trả lời bởi đội ngũ nòng cốt NUnit, here.)

[TestCase(-10, 2, -5)] 
[TestCase(-1, 2, -0.5)] 
public void TestDivide(double a, double b, double result) 
{ 
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result)); 
} 

[TestCase(-1, 0)] 
public void TestDivideThrows(double a, double b) 
{ 
    Assert.That(() => _uut.Divide(a, b), Throws.TypeOf<ArgumentException>()); 
} 
+1

Nếu bạn thực sự muốn để buộc hai vào một trường hợp thử nghiệm duy nhất, bạn có thể thêm một đối số throwsException boolean và thử nghiệm nó. Tuy nhiên, sự hiện diện của một nếu - thì - khác và hai kỳ vọng hoàn toàn khác nhau sẽ chứng minh rằng điều này thực sự nên là hai thử nghiệm khác nhau. – Charlie

+1

Cú pháp thấp hơn dường như không hoạt động trên hệ thống của tôi (NUnit 3.2.1) khi sử dụng lệnh gọi phương thức tĩnh ... - đủ hài hước, 'Assert.Throws (() => MyStaticClass.MyStaticMethod (badparameter)) 'làm việc. – ChriPf

+0

Cảm ơn @ChriPf - Tôi nghĩ rằng nó phải là một func. Tôi đã chỉnh sửa nó. – Chris

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