0
將Web服務調用提取到抽象中時,可以輕鬆地測試它們,而不依賴於正在聯機的Web服務如何抽象由服務自動調用的事件處理程序?我遇到的問題是,由於我使用的API(EWS)每個類都是內部的,因此我無法創建它們。這在單元測試時變成了一個問題,因爲我不能說例如當事件被觸發時它應該執行x
,y
和z
。用我自己的抽象web服務事件
我該如何提取這些事件處理程序與我自己的,所以我可以輕鬆地嘲笑他們?
將Web服務調用提取到抽象中時,可以輕鬆地測試它們,而不依賴於正在聯機的Web服務如何抽象由服務自動調用的事件處理程序?我遇到的問題是,由於我使用的API(EWS)每個類都是內部的,因此我無法創建它們。這在單元測試時變成了一個問題,因爲我不能說例如當事件被觸發時它應該執行x
,y
和z
。用我自己的抽象web服務事件
我該如何提取這些事件處理程序與我自己的,所以我可以輕鬆地嘲笑他們?
您需要在支持接口的類中包裝類。例如,如果您的服務使用是這樣的:
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
。
希望有所幫助。