如何对调用WCF服务的业务层方法进行单元测试?
示例:
public void SendData(DataUnit dataUnit)
{
//this is WCF call
SomeServiceClient svc = new SomeServiceClient();
svc.SomeMethod(dataUnit);
}
我可以在单元测试项目中模拟SomeServiceClient吗?
答案 0 :(得分:12)
您的问题在于您已将业务层与WCF服务紧密耦合 - 您实际上是在业务层中创建服务客户端的新实例,这意味着现在无法调用SendData方法而无需调用服务方法。
这里最好的解决方案是将依赖注入引入您的架构。
最简单的方法是,将服务类的实例传递到业务层。这通常使用构造函数参数在类构造时完成。
public class BusinessClass
{
private ISomeServiceClient _svc;
public BusinessClass(ISomeServiceClient svc)
{
_svc = svc;
}
public void SendData(DataUnit dataUnit)
{
_svc.SomeMethod(dataUnit);
}
}
请注意,上面的代码是一种设计模式,完全不依赖于任何框架,如Inversion of Control容器。
如果贵公司的政策是不使用此类框架(顺便说一句疯狂的政策),您仍然可以在单元测试中手动注入服务的模拟实例。
答案 1 :(得分:1)
您应该将服务电话与业务层分开:
使用下面的演示,您列出的业务层方法现在看起来像这样:
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
}
}