2011-11-21 1 views
14

예외적으로 매개 변수 이름을 검사 할 테스트가 있습니다. MS 테스트에서 어떻게 작성합니까?NUnit에서 MS TEST로 어설 션 예외

ArgumentNullException exception = 
       Assert.Throws<ArgumentNullException>(
          () => new NHibernateLawbaseCaseDataLoader( 
               null, 
               _mockExRepository, 
               _mockBenRepository)); 

Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName); 

테스트에서 catch 블록을 사용하는 것을 피할 수 있도록 나는 깔끔하게 노력하고 있습니다.

답변

29
public static class ExceptionAssert 
{ 
    public static T Throws<T>(Action action) where T : Exception 
    { 
    try 
    { 
     action(); 
    } 
    catch (T ex) 
    { 
     return ex; 
    } 

    Assert.Fail("Expected exception of type {0}.", typeof(T)); 

    return null; 
    } 
} 

위의 확장 방법을 테스트 도우미로 사용할 수 있습니다. 여기 사용하는 방법의 예입니다

// test method 
var exception = ExceptionAssert.Throws<ArgumentNullException>(
      () => organizations.GetOrganization()); 
Assert.AreEqual("lawbaseFixedContactRepository", exception.ParamName); 
+0

두 번째 코드 블록에서이 – cpoDesign

+0

을 해결하는 방법을 좋아한다면 예외를 확인하는 것이 더 정확하지 않습니까? = null? – syclee

+0

나머지 예외에 대해 다른 catch 블록을 추가 할 수 있으며 "Expected Exception abc but got xyz"라고 말할 수 있습니다. – Hash

3

MSTest [ExpectedException] 특성이 메시지의 텍스트를 확인하지 않기 때문에 최선의 방법은 Message/ParamName 예외 속성에서 Assert를 catch하고 설정하는 것입니다.

7

뻔뻔 플러그,하지만 난 Assert.Throws() 구문을 사용하여 주장 예외 및 예외 메시지 MSTEST에서 좀 더 쉽고 읽기를 만드는 간단한 조립을 썼다 nUnit/xUnit 스타일.

당신은 사용 Nuget에서 패키지를 다운로드 할 수 있습니다 PM>

MSTestExtensions-패키지를 설치 또는 당신은 여기에 전체 소스 코드를 볼 수 있습니다, https://github.com/bbraithwaite/MSTestExtensions

높은 수준의 지침을 어셈블리를 다운로드 및 상속 BaseTest이고 Assert.Throws() 구문을 사용할 수 있습니다. 다음과 같이

(가) 구현을 예외에 대한 주요 방법은 같습니다

public static void Throws<T>(Action task, string expectedMessage, ExceptionMessageCompareOptions options) where T : Exception 
{ 
    try 
    { 
     task(); 
    } 
    catch (Exception ex) 
    { 
     AssertExceptionType<T>(ex); 
     AssertExceptionMessage(ex, expectedMessage, options); 
     return; 
    } 

    if (typeof(T).Equals(new Exception().GetType())) 
    { 
     Assert.Fail("Expected exception but no exception was thrown."); 
    } 
    else 
    { 
     Assert.Fail(string.Format("Expected exception of type {0} but no exception was thrown.", typeof(T))); 
    } 
} 

더 많은 정보 here.

+0

@ joran 나는이 질문에 대한 유익한 답변을 기다리고 있습니다 ... –

+0

나는 아무 것도 주면 안되지만 고맙습니다. 내 의견에 불쾌하지 않았 으면 좋겠다. SO에 대한 전문 지식은 완전히 다른 주제 영역에 있지만, 편집 할 수 있으면 편집 할 수있는 사이트로 되돌아 가서 더 높은 수준의 답변을 게시 할 수 있도록 장려합니다. 그것은 모두 다른 사람들에게 훨씬 더 귀중한 자원 인 사이트에 추가됩니다. – joran

+0

@ joran 공정하게 :) –