问题描述
|
如何对调用WCF服务的业务层方法进行单元测试?
例:
public void SendData(DataUnit dataUnit)
{
//this is WCF call
SomeServiceClient svc = new SomeServiceClient();
svc.SomeMethod(dataUnit);
}
有什么方法可以在单元测试项目中模拟SomeServiceClient?
解决方法
这里的问题是您已将业务层与WCF服务紧密耦合-实际上在业务层中创建了服务客户端的新实例,这意味着现在不调用服务方法就无法调用SendData方法。
最好的解决方案是将依赖注入引入您的体系结构。
最简单的是,您要做的就是将服务类的实例传递到业务层。这通常是在类构造时使用构造函数参数完成的。
public class BusinessClass
{
private ISomeServiceClient _svc;
public BusinessClass(ISomeServiceClient svc)
{
_svc = svc;
}
public void SendData(DataUnit dataUnit)
{
_svc.SomeMethod(dataUnit);
}
}
请注意,上面的代码是一种设计模式,绝对不依赖于任何框架(如控制容器倒置)。
如果您公司的政策是不使用此类框架(顺便说一句疯狂的政策),您仍然可以在单元测试中手动注入服务的模拟实例。
,您应该将服务呼叫与业务层分开:
使用下面的演示,您列出的业务层方法现在看起来像这样:
public void SendData(IMyInterface myInterface,DataUnit dataUnit)
{
myInterface.SomeMethod(dataUnit);
}
如果要执行服务调用,请传递RealThing;如果只想运行测试,请传递TestThing:
public interface IMyInterface
{
void SomeMethod(DataUnit x);
}
public class RealThing : IMyInterface
{
public void SomeMethod(DataUnit x)
{
SomeServiceClient svc = new SomeServiceClient();
svc.SomeMethod(x);
}
}
public class TestThing : IMyInterface
{
public void SomeMethod(DataUnit x)
{
// do your test here
}
}