2011-12-12 3 views
0

를 계약합니다 나는 다음과 같은 방법이 있습니다 단위 테스트는

public static DateTime SubQtrs(this DateTime dt, int qtrs) 
{ 
    Contract.Requires(qtrs > -1); 
    Contract.Requires((qtrs * 3) >= -120000 && (qtrs * 3) <= 120000); 
       // do something 
    } 

가 나는 paramertized 단위 테스트를 생성하고 몇 가지 단위 테스트와 함께 올 PEX를 사용합니다. 예상대로 Pex는 계약 제약 조건을 테스트하고 계약을 위반 한 qtrs 값을 전달했습니다. 나는 유닛 테스트에서 ExpectedException (typeof (TraceAssertionException)) 및 모든 것이 통과 될 것이라는 예외를 기대한다고 말했다. 난 그냥 (PEX없이) MS 테스트 장치와 단위 테스트를 실행할 때

지금, 오류가 발생합니다 : Descrtipion을 : 전제 조건 실패 : (qtrs * 3> = -120000 & & ......

.. 그것은 나에게 스택 추적을 제공

기본적 그럼 난 중단, 다시 시도 또는 무시하는 선택을 제공하고있어 contracthelper 실패 말해

어느 쪽이든을, 테스트가 실패하고 난 얻을 : 실패 SubQtrsThrowsTraceAssertionException818 DGALib.Extensions을 .Tests 테스트 메서드 System.ExtensionMethodsTest.SubQtrsThrowsTraceAssertionException818 예외를 Throw했습니다. System.ArgumentOutOfRangeException, 예외 Microsoft.Pex.Framework.Exceptions.TraceAssertionException이 필요합니다. 예외 메시지 : System.ArgumentOutOfRangeException : 월 값은 +/- 120000 사이 여야합니다. ...

단위 테스트에서 더 이상 코드 계약 오류를 인식하지 못하는 이유는 무엇입니까?

답변

0

해당 화면을 포기하는 테스트에 [HostType ("Moles")]가 누락 된 것으로 보입니다.

나는 추적 어설 션을 던지기로되어 있고 문제를 일으키지 않은 다른 테스트와 문제를 일으키는 테스트를 비교했습니다. 유일한 차이점은 문제가 발생한 원인이 [HostType ("Moles")] 누락 된 것입니다. 그 속성을 추가하자 마자 테스트가 효과가있었습니다.

계약서가 다른 곳에서 버블 링되어서 거친 거위에 나를 보내야한다는 오류가 있어야합니다.

나머지 테스트 시나리오에 두더지를 추가하기 전에 Pex가 테스트를 작성 했어야합니다.

0

단위 테스트를 수동으로 실행할 때 어셈블리에서 계약 다시 작성기를 실행하지 않아서 Requires 계약이 결코 예외를 발생시키지 않는 것 같습니다. 대신 ArgumentOutOfRangeException을 throw하는 메소드 내에 수동 검사 코드가있는 것처럼 들리지만 런타임시 계약 재 작성이없는 올바른 동작이지만 테스트에 대한 예상 예외와 일치하지 않습니다. 코드 계약 재 작성기가 설치되어 있는지 확인하고 프로젝트 설정에 예외 재 작성이 포함되어 있는지 확인하십시오.

내부 검사와 일치하도록 Exception 유형을 지정하는 Requires overload를 사용하십시오. 이 경우 재 작성을 사용할 계획이라면 다른 명시 적 예외를 제거 할 수도 있습니다.

Contract.Requires<ArgumentOutOfRangeException>((qtrs * 3) >= -120000 && (qtrs * 3) <= 120000 , "qtrs"); 
+0

먼저 계약 설정을 확인했습니다. 내 테스트 프로젝트에는 런타임 계약 확인 수행이 전체로 설정되어 있습니다. 계약서를 수령하지 않는 다른 이유가있을 수 있습니다. 위에서 설명한 것처럼 계약서에 특정 예외가 발생했지만 테스트 동작이 Pex 또는 MS 테스트 유닛 자체에서 실행 되든 동일하게 작동해서는 안됩니까? ArgumentOutOfRange 예외가 DateTime.Add 메서드에 의해 throw됩니다. – Chris

+0

@Chris, 음, 내 의심은 여전히 ​​단위 테스트 러너에서 실행하여 무언가가 계약 재 작성 단계를 우회하게 만들었다는 것입니다. –

관련 문제