2010-08-04 6 views
34

몇 가지 예외가 발생할 것으로 예상되는 일련의 테스트 사례가 있습니다. 이 때문에 예외를 다음과 같이 예상하도록 속성을 설정했습니다.NUnit 예상 예외

[ExpectedException("System.NullReferenceException")] 

로컬로 테스트를 실행할 때 모두 좋습니다. 그러나 TeamCity를 실행하는 CI 서버로 테스트를 이동하면 예외가 예상되는 모든 테스트가 실패합니다. 이것은 알려진 버그입니다.

NUnit에서 제공하는 Assert.Throws<>Assert.Throws 메서드도 있다는 것을 알고 있습니다.

제 질문은 현재 사용하고있는 속성 대신이 속성들을 어떻게 사용할 수 있습니까?

나는 StackOverflow를 둘러 보았고 어떤 것도 나를 위해 작동하지 않는 몇 가지를 시도했다.

이것을 사용하는 간단한 1 라인 해결책이 있습니까?

답변

62

나는 당신이 문제를 일으키는 것을 시도했는지 확신 할 수 없지만 단순히 Assert.Throws의 첫 번째 인수로 람다를 전달할 수 있습니다. 여기에 전달 내 테스트 중 하나에서 하나 :

Assert.Throws<ArgumentException>(() => pointStore.Store(new[] { firstPoint })); 

좋아, 예를 조금 자세한되었을 수 있습니다. 나는 o.Foo()가 null 참조 예외를 발생 때문에 일반적으로 통과 할 것 테스트

[Test] 
[ExpectedException("System.NullReferenceException")] 
public void TestFoo() 
{ 
    MyObject o = null; 
    o.Foo(); 
} 

있다고 가정.

그런 다음 ExpectedException 속성을 삭제하고 o.Foo()에 전화를 Assert.Throws으로 묶습니다.

[Test] 
public void TestFoo() 
{ 
    MyObject o = null; 
    Assert.Throws<NullReferenceException>(() => o.Foo()); 
} 

Assert.Throws "이 특정 예외를 발생하는지 확인하기 위해, 대표로서 표현되는 코드를 호출하기 위해 시도한다." () => DoSomething() 구문은 본질적으로 익명 메서드 인 람다을 나타냅니다. 이 경우 Assert.Throws에 스 니펫 o.Foo()을 실행하라고 말합니다.

그래서, 당신은 속성을 수행하는 것처럼 한 줄을 추가하지 않습니다. Assert.Throws에 대한 호출에서 예외를 throw하는 테스트 섹션을 명시 적으로 래핑해야합니다. 이 필요하지 않습니다.은 람다를 사용해야하지만, 가장 편리합니다.

+0

this() => pointStore.Store (new [] {firstPoint})가 무엇인지 잘 모르겠습니다. 내 테스트 기능에 넣을 수있는 단일 라인이 없습니까? – Martin

+0

추가 정보를 제공해 주셔서 감사합니다. 마크, 정말 명확하게 도와주었습니다. 감사합니다! – Martin

+0

고마워요! 내 문제가 해결 됐어. 또한, o.Foo가 기다릴 수 있다면'Assert.Throws (async() => await o.Foo())'를 사용해야합니다. – CrazyRussianCoder

6

다음은 두 가지 방법을 사용하는 간단한 예입니다.

string test = null; 
Assert.Throws(typeof(NullReferenceException),() => test.Substring(0, 4)); 
Assert.Throws<NullReferenceException>(() => test.Substring(0, 4)); 

람다를 사용하지 않으려는 경우.

[Test] 
public void Test() 
{ 
    Assert.Throws<NullReferenceException>(_TestBody); 
} 

private void _TestBody() 
{ 
    string test = null; 
    test.Substring(0, 4); 
} 
2

기본적으로 TeamCity는 ExpectedException이없는 NUnit 2.2.10을 사용합니다. TeamCity "NUnit for NAnt"문서를 확인하여 TeamCity가 제공하는 특정 릴리스 목록을 포함하여 더 현대적인 것으로 변경하는 방법을 확인하십시오.