NUnit Assert.Throws 메소드 또는 ExpectedException 속성을 사용합니까?


146

나는 이것이 예외를 테스트하는 두 가지 주요 방법 인 것으로 나타났습니다.

Assert.Throws<Exception>(()=>MethodThatThrows());

[ExpectedException(typeof(Exception))]

이 중 어느 것이 가장 좋을까요? 하나는 다른 것보다 장점을 제공합니까? 아니면 단순히 개인적인 취향의 문제입니까?


3
세 번째 옵션은 유창한 스타일입니다 :Assert.That(() => MethodThatThrows(), Throws.Exception)
Jack Ukleja

1
NUnit 버전 3 이상은 더 이상 ExpectedException속성을 지원하지 않으므로 버전 3+의 경우 Assert.Throws변형 만 관련됩니다.
joanlofe

왜 그래야만하지? Nunit3가 그 지원을 중단하기로 결정 했습니까? 인터넷 검색을하고 있었고 설명을 찾을 수 없었습니다 ... JUnit은 여전히이 방법을 지원하지 않습니까?
ahaaman

답변:


92

첫 번째는 여러 번의 호출로 둘 이상의 예외를 테스트 할 수있게합니다.

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

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


25
테스트는 하나의 고유 한 논리 비트 만 테스트해야하므로 동일한 단위 테스트에서 두 가지 오류를 테스트하는 것이 나쁜 습관으로 간주되지 않습니까?
SamuelDavis

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

3
어느 쪽이든, 여기서 예외를 매개 변수로 사용하면 예외에 대한 세부 정보를 확인할 수 있습니다. 또한 "예외 예외"를 사용한다고해서 다른 메소드 호출에서 발생하는 것과 동일한 예외 유형이 보호되지는 않습니다. 여기서는 전체 테스트가 아닌 정확한 방법을 대상으로합니다. 테스트에서 아주 작은 코드를 호출해야하지만 너무 안전하지는 않습니다. 특히 코드가 복잡해지고 예외가 너무 일반적인 경우. "ArgumentNullExceptions"와 같은 항목은 많이 발생할 수 있으며 예를 들어 ExpectedException을 사용하여 쉽게 놓칠 수 있습니다. Assert.Throws는 그것을 놓치지 않을 것입니다.
Gil Sand

254

주요 차이점은 다음과 같습니다.

ExpectedException()테스트 메소드의 어느 위치 에서나 예외가 발생하면 속성이 테스트를 통과 시킵니다.
의 사용법은 예외가 예상되는 코드의 위치 Assert.Throws()를 지정할 수있게합니다 exact.

NUnit 3.0은 ExpectedException모두 공식 지원을 중단합니다.

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


7
이것은 정답입니다. 또한 Assert.Throws ()는 예외를 반환하므로 예외 속성이 중요한 경우 추가 속성을 검사 할 수 있습니다.
완벽 주의자

1
마지막으로 왜 ExpectedException을 사용할 수 없는지 대답합니다. .. 버전 3에서 작동
JanT


이것을 NUnit 3.0에서 작동하도록 변경하려면 다음과 같이
Andrei Krasutski

38

예외가 발생한 후 다른 조건을 확인하고 주장 할 수 있기 때문에 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");

    }

이것은 더 나은 답변 중 하나입니다. 예외가 발생한 후 무언가가 오류 상태에 있는지 확인하려는 것이 일반적입니다.
Rhys Bevilaqua

11

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

Assert.Throws<System.InvalidOperationException>(() => breakingAction())

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.