2014-01-23 2 views
4

SOAP 웹 서비스를 호출하는 작은 콘솔 응용 프로그램을 상속 받았습니다. 그것은 여러 가지 방법으로 예외를 기록하는 중첩 된 try-catch의 비극적 인 혼란입니다. SoapException이 throw 될 때 동작하는 방법에 대해 몇 가지 테스트 범위를 감싸고 싶습니다.단위 테스트 오류 처리에 Moq을 사용하여 SoapException을 조롱하는 방법

질문 : 인터페이스를 모의 할 수없고 "가상"속성이나 메서드를 만들 수 없을 때 어떻게 Moq을 사용하여 SoapException과 같은 클래스를 조롱 할 수 있습니까?

조금 더 설명 :

이 오류 처리를 테스트하려면, 나는 오류 처리를 확인하기 위해 SoapException 개체의 Actor 특성뿐만 아니라 Detail 속성을 제어 할 필요가있다.

내 단위 테스트 코드의 조각 :시 SetupGet(...) 라인을 실행할 때

나는 구체적인 클래스를 조롱하고있어, 그리고 Actor 속성은 "가상"으로 표시되지 않기 때문에
[TestMethod] 
public void MyTestMethod() 
{ 
    Mock<SoapException> soapMock = new Mock<SoapException>(MockBehavior.Strict); 

    soapMock.SetupGet<string>(ex => ex.Actor).Returns("Test Actor"); 

는, MOQ이 예외를 던지고있다 테스트 실행 :

System.NotSupportedException : 전 => ex.Actor

: 가상이 아닌 (VB에서 재정의) 구성원의 잘못된 설치

약간의 읽기 후에 이상적인 대답은 인터페이스를 조롱하는 것입니다.이 경우에는 할 수 없습니다. 이 클래스는 .Net 프레임 워크에서 구워 졌기 때문에 마법처럼 Actor 속성을 가상으로 표시 할 수는 없습니다.

어떻게 SoapException을 조롱하거나 오류 처리를 확인할 수있는 다른 방법이 있습니까?

제쳐두고, 나는 내부에 XML 노드가있는 실제 SoapException을 만들었지 만 프로그래밍 방식으로 XML 문서 트리를 만드는 토끼 구멍에 빠져 들었습니다. 내가 할 수 있지만 가능하면 피하고 싶습니다 테스트 설치 코드의 더 많은 라인이 필요합니다.

답변

1

Moq을 사용하여 조롱하는 것은 불가능합니다. 한 가지 옵션은 Microsoft Fakes Framework입니다. 모의하려고하는 코드가 인터페이스를 사용하지 않거나 시나리오와 같은 가상 메소드 인 경우에 사용할 수 있습니다.

아래의 msid의 Shim 설명을 참조하십시오.

끼움 런타임에 응용 프로그램의 컴파일 된 코드를 수정 그래서 대신 특정 메서드 호출을 만드는, 그것은 심 코드 테스트가 제공하는 을 실행합니다. Shim을 사용하여 수정할 수없는 어셈블리 (예 : .NET 어셈블리) 어셈블리를 호출 할 수 있습니다. 프레임 워크를 가짜

http://msdn.microsoft.com/en-us/library/hh549175.aspx

참고 Visual Studio를 궁극적 인 또는 프리미엄에서만 사용할 수 있습니다.

+0

나는 이것을 시험해 보겠다. 감사. –

+0

필자는 Microsoft Fakes에 Visual Studio 2012 이상이 필요하다는 것을 발견했습니다. 나는 Visual Studio 2010을 가지고 있지만 [Microsoft Moles Framework] (http://visualstudiogallery.msdn.microsoft.com/b3b41648-1c21-471f-a2b0-f76d8fb932ee/)가 Fakes의 전신 인 것을 알았습니다. 나는 그것을 시도 할 것이지만, 나는 현재의 대답이기 때문에이 질문을 대답으로 표시하고있다. 또한 Visual Studio 2010에 대한 내 대답도 게시 할 것입니다. –

1

동일한 상황에서 SoapException을 조롱했습니다. Detail, Actor 등을 전달하기 위해 SoapException의 생성자를 사용했습니다. 아래에는 Rhino Mock을 사용하고 있습니다.

//Build your xmlDocument 
    SoapException mockSoapException = MockRepository.GenerateMock<SoapException>("Mock SoapException", new XmlQualifiedName(), "TEST", xmlDocument); 
+0

하지만 XML 문서를 직접 작성하고 싶지는 않습니다. –

관련 문제