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

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

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

[ExpectedException(typeof(Exception))]

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



답변

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

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

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


답변

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

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

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

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


답변

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

    }


답변

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

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


답변

이전 버전 ( <= 2.0 ) NUnit을 사용하는 경우을 사용해야 ExpectedException합니다.

당신이 사용하는 경우 2.5 이상 버전을 당신은 사용할 수 있습니다Assert.Throw()

https://github.com/nunit/docs/wiki/Breaking-Changes

사용 방법 :
https://www.nunit.org/index.php?p=exceptionAsserts&r=2.5


답변