문제

특정 ErrorCode에 대해서만 ManagementException 예외를 처리하고 싶고 단위 테스트를 작성하는 데 어려움이 있습니다. 일반적으로 테스트를 작성하여 다음과 비슷합니다.

Searcher search = MockRepository.GenerateMock<Searcher>(); 
// wrapper for ManagementObjectSearcher

...

search.Expect(s => s.Get()).Throw(new ManagementException());

...

그러나 이것은 오류 코드를 내가 원하는 것로 설정하지 않으며, 특히 ManagementException에는이 값을 설정하는 생성자가 없습니다.

이 작업은 어떻게 할 수 있습니까?

(Rhinomocks를 조롱 프레임 워크로 사용하고 있지만 이것이 프레임 워크 독립이라고 가정하고 있습니다. 여기서 알아야 할 것은 특정 오류 코드 값을 가진 ManagementException을 만드는 방법입니다. 또한 일부 참조를 찾았습니다. System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode) 온라인 방법이지만 이것은 공개적으로 액세스 할 수없는 것 같습니다).

도움이 되었습니까?

해결책

이 장애물을 극복하려는 최소한의 노력은 필요한 오류 코드에서 반사에 반사를 사용하는 정적 도우미 / 유틸리티 방법입니다. 가장 우수한 반사판을 사용하면 ManagementException에 정의 된 내부 CTOR를 통해서만 설정되는 개인 "ErrorCode"필드가 있습니다. 그래서 :)

public static class EncapsulationBreaker
   {
      public static ManagementException GetManagementExceptionWithSpecificErrorCode(ManagementStatus statusToBeStuffed)
      {
         var exception = new ManagementException();
         var fieldInfo = exception.GetType().GetField("errorCode", 
            BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.DeclaredOnly);
         fieldInfo.SetValue(exception, statusToBeStuffed);
         return exception;
      }
   }

작동하는지 확인했습니다

[Test]
      public void TestGetExceptionWithSpecifiedErrorCode()
      {
         var e = EncapsulationBreaker.GetManagementExceptionWithSpecificErrorCode(ManagementStatus.BufferTooSmall);
         Assert.AreEqual(ManagementStatus.BufferTooSmall, e.ErrorCode);
      }

하지만 나는 일반적으로 시험에 반영되면 눈살을 찌푸렸다, 이것은 필요한 / 유용한 드문 경우 중 하나입니다.
HTH

다른 팁

ManagementException에서 클래스를 도출하고 자신의 오류 코드 구현을 숨기십시오. 모의 가이 수업을 반환하도록하십시오.

매우 간단하고 작은 방법이나 클래스를 사용하여 해당 예외를 포착하고 오류 코드를 가져온 다음 작업을 수행하는 실제 클래스로 전달합니다. 테스트 중에 해당 코드를 실제 클래스로 직접 전달하여 해당 오류 코드를 얻을 때 전달할 수있는 것을 바꾸십시오.

가장 분명한 방법은 예외를 서브 클래스하는 것이지만, 그렇지 않으면 작동하지 않으면 코드를 포착하고 즉시 자신만의 예외를 버릴 수있는 코드가 다른 옵션이 될 수 있습니다.

나는 서브 클래스를 할 것이다 ManagementException 그리고 서브 클래스에서 ErrorCode getter (정상적인 보호 수준이 당신이 그렇게하지 못하면 내성이 당신을 더 가까워 질 수 있습니다). 처리하는 모든 코드 ManagementException 그러나 특정 서브 클래스에 대해 들어 본 적이 없습니다. ManagementException 결국 테스트 목적으로 시뮬레이션하려고합니다.

편집하다: 그것은 생각할 수 있습니다 ErrorCode 그냥 재정의 할 수는 없습니다 (나는 너무 견고한 언어가 싫어서 이런 식으로 테스트를 중단 할 수 있지만 존재한다는 것을 부정 할 수는 없습니다. ;-). 이 경우 의존성 주입 여전히 당신을 절약 할 수 있습니다 - DI는 내가 가장 좋아하는 테스트 패턴 중 하나입니다.

테스트에서 DI의 목적은 테스트중인 코드를 테스트중인 강력한 가정에서 분리하는 것입니다. 이는 비록 비록 비록 비록 우리가 여기있는 것입니다. 테스트중인 코드는 현재 x.ErrorCode 예외의 오류 코드를 얻으려면 x. 그런 다음 대신해야합니다. getErrorCode(x) 어디 getErrorCode 일반적으로하는 대의원입니다 return x.ErrorCode; 그리고 그것은 세트가 있어야합니다 getErrorCode 테스트 목적으로 대의원에게 변경할 수 있습니다. return 23 (또는 테스트를 위해 시뮬레이션하려는 오류 코드 값).

세부 사항은 다양 할 수 있지만 의존성 주입은 (무엇보다도)이 예에서와 같이 시스템 (또는 직접 수정할 수없는 다른 라이브러리 및 C에서 얻을 수있는 과도한 강성을 보상하는 데 도움이 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top