2013-02-21 4 views
121

나는이 예외에 대한 테스트의 두 가지 주요 방법이 될 것 같습니다 것을 발견했다? 하나는 다른 것보다 이점을 제공합니까? 아니면 단순히 개인 취향의 문제입니까?NUnit Assert.Throws 메서드 또는 ExpectedException 특성을 사용합니까? <pre><code>Assert.Throws<Exception>(()=>MethodThatThrows()); [ExpectedException(typeof(Exception))] </code></pre> <p></p> 이들 중 가장 좋은 것입니다 :

+1

세 번 째 옵션은 유창 스타일 :'Assert.That (() => MethodThatThrows(), Throws.Exception)' – Schneider

답변

71

첫 번째는 여러 통화로, 하나 개 이상의 예외 테스트 할 수 있습니다 :

Assert.Throws(()=>MethodThatThrows()); 
Assert.Throws(()=>Method2ThatThrows()); 

두 번째는 당신이 테스트 기능 당 하나 개의 예외 테스트 할 수 있습니다.

+19

테스트는 하나의 논리 비트만을 테스트해야하므로 같은 단위 테스트에서 두 개의 오류를 테스트하는 것이 좋지 않은 것으로 간주되지 않을까요? – SamuelDavis

+5

@ SamuelDavis - 일반적으로 동일한 테스트에서 다른 사례를 테스트하고 싶지는 않습니다. 그러나, 여러 Assert.Throws에 대한 사용 사례가있을 수 있습니다. –

+2

어느 쪽이든, 여기서 예외를 매개 변수로 가져와 예외의 세부 사항을 명시 할 수 있습니다. 또한 "Expected Exception"을 사용한다고해서 다른 메서드 호출에서 throw되는 동일한 예외 유형에 대해 보호되지 않습니다. 여기서는 전체 테스트가 아닌 정확한 방법을 대상으로합니다. 테스트에서 코드를 거의 호출하지 않아도 안전하지는 않습니다. 특히 코드가 복잡 해지거나 너무 예외적 일 때. "ArgumentNullExceptions"와 같은 항목은 많이 throw 될 수 있으며 ExpectedException을 사용하여 쉽게 놓칠 수 있습니다. 주장 해. 그리워하지 않을거야. –

28

나는 assert.throws를 선호하는데, 예외가 발생 된 후에 다른 조건을 확인하고 선언 할 수 있기 때문입니다.

[Test] 
    [Category("Slow")] 
    public void IsValidLogFileName_nullFileName_ThrowsExcpetion() 
    { 
     // the exception we expect thrown from the IsValidFileName method 
     var ex = Assert.Throws<ArgumentNullException>(() => a.IsValidLogFileName("")); 

     // now we can test the exception itself 
     Assert.That(ex.Message == "Blah"); 

    } 
+0

이것은 더 나은 답변 중 하나입니다. 예외가 throw 된 후 무언가가 오류 상태로 들어 갔는지 확인하려는 경우가 일반적입니다. –

226

주요 차이점은 다음

ExpectedException() 속성 예외 의 시험 방법에 어떤 장소 발생하면 테스트가 통과한다.
Assert.Throws()을 사용하면 exact 예외가 예상되는 코드 위치를 지정할 수 있습니다.

NUnit 3.0은 공식적으로 ExpectedException에 공식 지원을 제공합니다.

따라서 ExpectedException() 속성 대신 Assert.Throws() 메서드를 사용하는 것이 좋습니다.

+4

이것은 정답입니다. 덧붙여, Assert.Throws()는 예외를 반환하기 때문에 예외의 속성에 대한 추가 검사가 필요할 수 있습니다. – perfectionist

+0

마지막으로 왜 ExpectedException을 버전 3에서 사용할 수 없는지 대답하십시오. – johnyTee

+1

다음 링크는 https://github.com/nunit/docs/wiki/Breaking-Changes - ExpectedExceptionAttribute를 더 이상 지원하지 않습니다. – Spirit

9

예상되는 오류 (예 : 이전 attrib 버전)를 강하게 입력 할 수도 있습니다.

Assert.Throws<System.InvalidOperationException>(() => breakingAction()) 
관련 문제