2010-02-02 7 views
1

그래서 나는 내가 나쁜 데이터가 들어오는 제대로 예외가 발생 보장하기 MSTests를 통해 단위 테스트 방법이야했다.Debug.Assert가 MSTests를 방해합니다. 어떻게 해결합니까?

그러나 디버깅하는 동안 캐치 그래서 그것이 실제 시험 중에 발생하는 경우 그 방법은 Debug.Assert있다 디버그 모드에서 버그를 찾으려고합니다.

그래서 Assert 문에 Abort, Retry, Ignore가 나타나므로이 방법으로 실행하면 자동으로 단위 테스트가 실패합니다. 다음 세 가지 상황이 모두 중요합니다.

디버깅 중이며 문제가 발생 했으므로 Debug.Assert를 사용할 수있게하려고합니다. 코드에는 적절한 보호 절이 있어야합니다. 프로덕션 환경에서 발생하면 예외가 발생합니다. 내 단위 테스트는 완전히 자동화되어야하며 수동 클릭없이 실행해야합니다.

해결 방법은 무엇입니까?

답변

2

지금까지 내가 의도적으로 전달 되었기 때문에 단위 테스트, 니콜의 솔루션은 내가 원하는 것을하지 않았다 로컬로 실행되는 경우 예외가 발생하는지 확인하기 위해 Assert를 트립하는 값은 로컬 자동화 된 단위 테스트를 실행하는 것을 방해합니다. [Conditional("DEBUG")] 컴파일 속성을 허용하고 릴리스 모드에서 단위 테스트를 실행하려는 경우 작동한다고 가정합니다. 테스트 어셈블리에서 [Conditional("DEBUG")]으로 테스트 레벨 (또는 어셈블리 레벨) 래퍼를 제공 할 수 있지만, 미리 컴파일 된 재사용 가능한 클래스 라이브러리에서 활용할 수 있습니다.

이것은 Trace.Listeners.Clear();를 호출하는 추가 요구 사항과 함께 내가 원하는 것과 아주 가깝게됩니다. 내 테스트 스위트에서.

/// <summary> 
/// To suppress UI assert messages use: 
/// Trace.Listeners.Clear(); 
/// </summary> 
/// <typeparam name="T"></typeparam> 
/// <param name="assertAgainst"></param> 
/// <param name="condition"></param> 
/// <param name="exception"></param> 
/// <returns></returns> 
public static T Assert<T>(this T assertAgainst, Func<T,bool> condition,Func<Exception> exception) 
{ 
    var conditionMet = condition(assertAgainst); 
    if (Debugger.IsAttached) 
     Debug.Assert(conditionMet); 

     //assertAgainst.Assert(x => x != null,() => new NullReferenceException()); 
     if (!conditionMet) 
      throw exception(); 

    return assertAgainst; 
} 
+0

Ben Hall에 따르면 테스트 프로젝트의 App.Config에서 추적 수신기를 지울 수도 있습니다. http://blog.benhall.me.uk/2008/05/disable-systemdiagnosticsdebugassert.html – rohancragg

0

Debug.Assert를 직접 호출하는 대신 Debug.Assert를 호출하기 전에 디버거가 연결되었는지 여부를 확인하는 래퍼 메서드를 호출 할 수 있습니다. (첨부 된 디버거가없는 경우는 물론, 그것은 예외가 발생합니다.) 예 :

[Conditional("DEBUG")] 
public static void Assert(bool condition) 
{ 
    if (Debugger.IsAttached) 
    { 
     Debug.Assert(condition); 
    } 
    else 
    { 
     throw new AssertionException(); 
    } 
} 
+0

로컬로 단위 테스트를 실행할 때 여전히 Debug.Assert가 호출됩니다. 그건 내가 원하는 것이 아니야. – Maslow

+0

테스트를 로컬로 디버깅 할 때 Debug.Assert가 호출되지만 디버거가 연결되지 않은 상태에서는 테스트를 실행할 때 디버그되지 않습니다. –

+0

맞습니다.하지만 로컬에서 단위 테스트를 실행하면 디버거가 연결되어 테스트를 방해합니다. – Maslow

0

This assert는 어설 션이 실패 할 경우는 테스트 케이스를 실패, 자동화 된 테스트를 방해하지 않을 것이다, 그러나 실행은 계속됩니다.

+2

나는 모델 코드에서 단언 할 수 없으며 단 단위 테스트에서만 그 코드를 유지해야한다. 나는 두 가지 실사를 모두 할 수있는 방법을 찾고있다. – Maslow

1

방금 ​​동일한 문제가 발생했지만 코드에 오류가 없으면이 시나리오가 나타나지 않아야한다는 것을 알았습니다. 어쨌든 나는 그 주장이 터지게 신경 쓰지 않을 것이다. 내 추론은 다음과 같습니다.

  1. Debug.Assert는 함수의 전제 조건이 충족되지 않았거나 함수 자체에 오류가있는 경우에만 적중되어야합니다.
  2. 단위 테스트는 함수의 사후 조건을 검사해야합니다.
  3. 함수는 전제 조건이 모두 충족되면 사후 조건 만 생성하면되므로 유효하지 않은 선행 조건을 전달하는 함수에 대한 단위 테스트를 작성할 필요가 없습니다.
관련 문제