2010-06-16 110 views
1

我有一些集成測試,我想驗證某些需求是針對第三方[arty webserver。我想我會用一個存根服務器替換第三方服務器,它只需記錄對它的調用。這些調用不需要成功,但我確實需要記錄所做的請求(主要是路徑+查詢字符串)。stub webserver進行集成測試

我正在考慮爲此使用IIS。我可以1)建立一個空的站點,2)修改系統的主機文件,將請求重定向到該站點3)在每個測試結束時解析日誌文件。

這是有問題的,因爲IIS不會立即寫入日誌文件,而且文件會連續寫入。我需要找到文件,在測試前閱讀內容,在測試後等待不確定的時間,閱讀更新內容等。

有人可以想到一個更簡單的方法嗎?

回答

5

您可以使用System.Net.HttpListener(MSDN LINK)。

它可以用作嵌入式WebServer,這意味着您甚至可以在不需要解析日誌文件的情況下即時檢查訪問。

I類在我的代碼使用最近:

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)。 – 2010-06-16 06:35:58

1

是的,我不認爲你需要一個整體的網絡服務器。您不需要測試HTTP。

做什麼需要測試的是你發送和接收的底層數據結構。因此,只需爲此創建測試(即,指出您可以使用預期內容驗證生成的數據格式,以及您打算接收的內容等)。

測試數據,而不是協議(除非顯然協議是自定義的)。

1

我在一些項目中做了一些非常類似於此的事情。

您不想創建存根Web服務。這只是添加一個你不需要的依賴。我所做的是創建一個模擬Web服務API的接口。然後,我創建了一個代理類,用於在實時系統中調用Web服務。爲了測試,我使用RhinoMocks創建了模擬類,返回我想測試的結果。這對我來說非常有用,因爲那時我可能會產生各種「意外」的行爲,這是現場系統無法做到的。

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

謝謝,但我真的很想在這種情況下進行集成測試。功能的最後一英里是沒有記錄行爲的第三方庫,所以我不想嘲笑。我同意mock對單元測試非常有用。 – 2010-06-16 16:25:59