2010-02-02 2 views
4

비 가상 함수와 객체의 단위 테스트 모의 만들려면 : 나는 이런 식으로 뭔가 보이는 wsdl.exe 도구를 사용하여 생성 된 가져옵니다 C# 클래스가

public partial class SoapApi : System.Web.Services.Protocols.SoapHttpClientProtocol 
{ 
    public SOAPTypeEnum AskServerQuestion() 
    { 
     object[] results = return this.Invoke("AskServerQuestion"); 
     return (SOAPTypeEnum) results[0]; 
    } 
} 

가 좀 얇은 래퍼가를 결과를 추적하는 코드 주위에 코드가 있습니다. 객체 가짜 프레임 워크를 사용하여 가짜 SoapApi 클래스를 만들고 씬 랩퍼 함수에 대한 각 호출에 대해 예측 가능한 결과를 반환 할 수 있습니까?

AskServerQuestion() 함수는 wsdl.exe 도구로 자동 생성되므로 가상으로 만들 수 없습니다.

+0

http://stackoverflow.com/questions/1073684/mocking-non-virtual-methods-in-c –

답변

4

이 작업을 수행 한 방식은 대신 ISoapApi 인터페이스가 자동으로 생성 된 SOAP API를 모방 한 ISoapApi를 삽입하는 것이 었습니다.

public interface ISoapApi 
{ 
    SOAPTypeEnum AskServerQuestion(); 
} 

그런 다음, 생성 된 SoapApi 클래스는 부분이라는 사실을 활용하고, 다른 파일이 추가 : 귀하의 경우를 들어

그런

public partial class SoapApi : ISoapApi 
{ 
} 

, 소비자는해야 조롱하는 프레임 워크로 조롱당하는 ISoapApi 의존성.

단점은 물론 SOAP API가 변경되면 인터페이스 정의도 업데이트해야한다는 것입니다.

+0

고마워요, 매력처럼 작동했습니다. 생성 된 클래스가 다른 인터페이스를 구현했기 때문에 몇 가지 요소를 추가해야했지만, 이는 확실히 올바른 경로였습니다. – ryancerium

+0

C# 용 wsdl 도구가 * 웹 서비스를 사용할 때 자동으로 서비스 인터페이스를 생성하여 문제를 해결하기를 바랍니다.하지만 슬프게도 그렇게 할 수있는 방법을 찾지 못했습니다. – Pete

1

클래스가 부분적이므로 클래스를 작성하는 부분 클래스 부분에 인터페이스를 구현할 수 있습니다. 그런 다음 인터페이스를 조롱 할 수 있습니다.

1

클래스가 이 아닌 경우 인 경우에 사용할 수있는 기술을 개발했습니다.

public SomeClass2 : SomeClass, ISomeClass 
{ 
    // The body of this class is empty. 
} 

:

public interface ISomeClass 
{ 
    void SomeFunc(); 
} 

지금 위의 모두에서 상속하는 새로운 클래스를 만들 :

// Generated class, can't modify. 
public class SomeClass 
{ 
    // Non-virtual function, can't mock. 
    public void SomeFunc() { //... } 
} 

먼저, 그 클래스에서 인터페이스를 추출 :이 원래 클래스입니다 가정 이제 프로그램에서 SomeClass2을 사용할 수 있습니다. SomeClass과 동일하게 동작합니다. 그리고 너는 ISomeClass을 조롱 할 수있다.

관련 문제