2010-06-16 3 views
1

필자는 세 번째 [arty 웹 서버]에 대한 요구 사항이 있는지 확인하고 싶습니다. 제 생각에는 제 3 자 서버를 단순히 호출을 기록하는 스텁 서버로 대체 할 생각이었습니다. 호출은 성공할 필요는 없지만 요청 된 레코드 (주로 경로 + 쿼리 문자열)가 필요합니다.통합 테스트 용 스텁 웹 서버

IIS 용으로 이것을 고려하고있었습니다. 1) 빈 사이트를 설정하고, 2) 요청을 해당 사이트로 리디렉션하도록 시스템의 호스트 파일을 수정합니다. 3) 각 테스트가 끝날 때 로그 파일을 구문 분석합니다.

IIS와 마찬가지로 로그 파일이 즉시 기록되지 않고 파일이 연속적으로 기록되기 때문에 문제가됩니다. 파일을 찾고 테스트 전에 내용을 읽은 다음 테스트 후 비 결정적 시간을 기다리고 업데이트 내용을 읽어야합니다.

누군가가 더 간단한 방법으로 생각할 수 있습니까?

답변

5

System.Net.HttpListener (MSDN LINK)를 사용할 수 있습니다.

임베디드 웹 서버로 작동하므로 로그 파일을 구문 분석하지 않고도 온 - 더 - 플라이 (on-the-fly) 방식으로 액세스를 확인할 수 있습니다.

나는 최근에 내 코드에 사용되는 클래스 :

class Listener 
{ 
    private HttpListener listener = null; 

    public event EventHandler CommandReceived; 

    public Listener() 
    { 
     this.listener = new HttpListener(); 
     this.listener.Prefixes.Add("http://localhost:12345/"); 
    } 

    public void ContextReceived(IAsyncResult result) 
    { 
     if (!this.listener.IsListening) 
     { 
      return; 
     } 
     HttpListenerContext context = this.listener.EndGetContext(result); 
     this.listener.BeginGetContext(this.ContextReceived, this.listener); 

     if (context != null) 
     { 
      EventHandler handler = this.CommandReceived; 
      handler(context, new EventArgs()); 
     } 
    } 

    public void Start() 
    { 
     this.listener.Start(); 
     this.listener.BeginGetContext(this.ContextReceived, this.listener); 
    } 

    public void Stop() 
    { 
     this.listener.Stop(); 
    } 
} 
+0

멋진 솔루션이지만,이 경우 꼭 필요한 것은 아니라고 생각합니다. 그래도 알기에 유용합니다 (따라서 upvote). –

1

그래, 난 당신이 전체 웹 서버를 필요가 있다고 생각하지 않습니다. HTTP를 테스트 할 필요가 없습니다.

무엇을 합니까? 테스트 할 필요가있는 것은 전송 및 수신하는 기본 데이터 구조입니다. 따라서 테스트를 만들면 (예 : 예상되는 데이터 형식과 생성하려는 데이터 형식의 유효성을 확인할 수있는 지점을 만들고, 수신 할 것으로 예상되는 지점 등을 작성)

프로토콜이 아니라 데이터를 테스트하십시오 (분명히 프로토콜이 사용자 정의가 아닌 경우).

1

저는 많은 프로젝트에서 이와 비슷한 것을했습니다.

스텁 된 웹 서비스를 만들고 싶지 않습니다. 그것은 단지 당신이 필요로하지 않는 의존성을 추가하는 것입니다. 내가 한 일은 웹 서비스 API를 모방 한 인터페이스를 만드는 것이었다. 그런 다음 라이브 시스템에서 웹 서비스를 호출 할 프록시 클래스를 작성했습니다. 테스트를 위해 RhinoMock을 사용하여 테스트하고 싶은 결과를 반환하는 조롱 된 클래스를 만들었습니다. 라이브 시스템에서는 불가능했던 모든 종류의 '예상치 못한'동작을 생성 할 수 있기 때문에 이것은 매우 유용했습니다. 이 같은

public interface IServiceFacade { 
    string Assignments(); 
} 

public class ServiceFacade : IServiceFacade { 
    private readonly Service _service; 

    public ServiceFacade(Service service) { 
     _service = service; 
    } 

    public string Assignments() { 
     return _service.Assignments(); 
    } 
} 

그럼 내 테스트 코드가 포함 된 것들 :이 매우 유용하다고

 var serviceFacade = MockRepository.GenerateMock<IServiceFacade>(); 
     serviceFacade.Stub(sf => sf.Assignments()).Return("BLAH BLAH BLAH"); 

또는

 serviceFacade.Stub(sf => sf.Assignments()).Return(null); 

또는
 serviceFacade.Stub(sf => sf.Assignments()).Throw(new Exception("Some exception")); 

.

+0

감사합니다.하지만이 경우에는 통합 테스트를하고 싶습니다. 기능상의 마지막 마일은 문서화되지 않은 행동을하는 제 3 자 라이브러리이므로 모의하고 싶지 않습니다.나는 모의 테스트가 단위 테스트에 훌륭하다는 데 동의한다. –