2011-09-06 2 views
2

명확한 어설 션식이없는 메서드 테스트가 있습니다. 반환 된 테스트 된 값은 프로그래머가 올바른지 검사하기 위해 검사해야하는 매우 긴 문자열입니다. 이런 이유로 코드가 예외없이 실행되면 'Assert.Inclusclusive'를 호출합니다.C# 단위 테스트에서 어설 션 예외를 필터링하는 방법

그러나 어떤 종류의 예외가 발생하면 예외 메시지와 함께 'Assert.Fail'을 호출하려고합니다. 이런 식으로 뭔가 :

 [TestMethod()] 
     public void Test() 
     { 
     try { 
      string toBeChecked = MethodToBeTested(); 
      //the string is so particular that no clear 
      //assertion can be made about it. 

      Console.WriteLine(toBeChecked);    
      Assert.Inconclusive("Check the console output.");    
     } catch(Exception e) { 
      Assert.Fail(e.Message); 
     } 
     } 

이 코드의 문제는, 어떤 일정한 예외가 발생되지 않는 경우, Assert.Inconclusive 방법도 사로 잡았되는 예외를 throw 너무 Assert.Fail이라고합니다, 그리고 IDE 테스트 결과 창에서 보인다 그 시험은 실패했다. 이것은 내가 원하는 것이 아닙니다.

모든 예외를 포착하는 등의 예외를 필터링하는 방법이 있습니까?

... 대신 Exception의 특정 예외 유형을 잡거나 AssertInconclusiveException입니다 Assert.Inconclusive 방법에 의해 발생 NUNIT 예외에 대한 또 다른 캐치를 추가 할

+0

가 불 연속적으로 테스트 할 수있는 메서드 호출 다른 방법을합니까 ManualAssertRequired :

은 적어도 시험에게 같은 것을 포함 도움이 이름을 부여? 그들이 모두 예상대로 작동하는지 테스트 할 수 있다면 호출하는 방법에 대해 확신을 가질 수 있습니다. –

+0

@ 그렉 B :이 경우 "모 놀리 식"방법이었습니다. 그러나 나는 그것에 대해 신경 쓰지 않는다. 내가 원했던 것은 실제로 다른 개발자가 예외가 아닌 한 결정적 결과를 볼 수 있지만 예외는 볼 수 없다는 것이다. –

답변

2

왜 Assert.Inclusclusive()를 생략하지 않을까요? 사실, 예외를 잡는 이유는 무엇입니까? 코드가 예외를 throw하면 단위 테스트 프레임 워크가 실패로 표시합니다. 더 적은 것 :

[TestMethod()] 
    public void Test() 
    { 
    string toBeChecked = MethodToBeTested(); 
    Console.WriteLine(toBeChecked);    
    } 

그러나 우리는 결과를 자동으로 확인할 수 없으면 열악한 단위 테스트입니다. 우리가 검사하는 것은 예외가 발생하지 않는다는 것이다. 결과 문자열에 대한 어설 션이 없습니까?

예를 들어 null이 아니거나 비어 있지 않습니까? 테스트 할 수있는 특정 하위 문자열이 포함될 것으로 기대합니까?

+0

좋아요, 예외를 던지면 테스트가 실패했다는 것을 알 수 없습니다. 불행히도 추가 주장을 할 수는 없으므로 테스트는 평소만큼 유용하지 않습니다. –

1

봅니다 (I는 .NET 프레임 워크 3.5SP1을 사용하고 있습니다)

예를 들어 다음과 같이 수정 : 당신이 ExcpectedException(typeof(AssertInconclusiveExcpetion))으로 테스트를 표시하거나 뭔가를 사용할 수 있습니다 있도록

[TestMethod()] 
    public void Test() 
    { 
    try { 
     string toBeChecked = MethodToBeTested(); 
     //the string is so particular that no clear 
     //assertion can be made about it. 

     Console.WriteLine(toBeChecked);    
     Assert.Inconclusive("Check the console output.");  
    } catch(AssertInconclusiveException e) { 
     // do nothing... 
    } catch(Exception e) { 
     Assert.Fail(e.Message); 
    } 
    } 
+0

AssertInconclusiveException의 슈퍼 클래스가있어, 다른 모든 assert를 캐치하고 있습니까? –

+1

실제로 : UnitTestAssertException'이 있습니다. –

2

Assert.Inconclusive 방법은 AssertInconclusiveException가 발생한다 다음과 같이 g :

[TestMethod()] 
    public void Test() 
    { 
    try { 
     string toBeChecked = MethodToBeTested(); 
     //the string is so particular that no clear 
     //assertion can be made about it. 

     Console.WriteLine(toBeChecked);    
     Assert.Inconclusive("Check the console output.");    
    } catch(AsssertInconclusiveException) { 
     /* Do nothing */ 
    } 
    } catch(Exception e) { 
     Assert.Fail(e.Message); 
    } 
    }