将Web服务调用提取为抽象时,可以轻松地测试它们,而不必依赖Web服务在线,如何抽象服务自动调用的事件处理程序?我遇到的问题是,因为我正在使用的API(EWS)已经内联了所有类,所以我无法创建它们。这在单元测试时会变成一个问题,因为我不能说,例如,当事件被触发时它应该x
,y
和z
。
如何用自己的方法提取这些事件处理程序,以便我可以轻松地模拟它们?
答案 0 :(得分: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
。
希望有所帮助。