2012-04-03 64 views
0

將Web服務調用提取到抽象中時,可以輕鬆地測試它們,而不依賴於正在聯機的Web服務如何抽象由服務自動調用的事件處理程序?我遇到的問題是,由於我使用的API(EWS)每個類都是內部的,因此我無法創建它們。這在單元測試時變成了一個問題,因爲我不能說例如當事件被觸發時它應該執行x,yz用我自己的抽象web服務事件

我該如何提取這些事件處理程序與我自己的,所以我可以輕鬆地嘲笑他們?

回答

1

您需要在支持接口的類中包裝類。例如,如果您的服務使用是這樣的:

var service = new SomeService(); 
service.SomeEvent =+ (o, e) => DoSomething(e); 
service.DoStuff(); 

您將創建一個接口:

public interface ISomeService 
{ 
    event EventHandler SomeEvent; 
    void DoStuff(); 
} 

而且你的實現類:

public class SomeServiceWrapper : ISomeService 
{ 
    private readonly SomeService _containedService; 

    public event EventHandler SomeEvent; 

    public SomeServiceWrapper() 
    { 
     _containedService = new SomeService(); 
     _containedService.SomeEvent += (o, e) => RaiseSomeEvent(e); 
    } 

    public void DoStuff() 
    { 
     _containedService.DoStuff(); 
    } 

    private void RaiseSomeEvent(EventArgs e) 
    { 
     EventHandler evt = SomeEvent; 
     if (evt != null) 
     { 
      evt(this, e); 
     } 
    } 
} 

然後你就可以創建一個虛擬ISomeService通過嘲弄或自己的虛擬課堂,並且您在生產中使用ISomeService實例SomeServiceWrapper

希望有所幫助。

相關問題