unit测试一个调用wcf服务的方法

如何对调用WCF服务的业务层方法进行unit testing?

例:

public void SendData(DataUnit dataUnit) { //this is WCF call SomeServiceClient svc = new SomeServiceClient(); svc.SomeMethod(dataUnit); } 

有没有办法在unit testing项目中模拟SomeServiceClient?

您的问题在于您已将业务层与WCF服务紧密耦合 – 您实际上在业务层中创建了服务客户端的新实例,这意味着现在无法在不调用服务方法的情况下调用SendData方法。

这里最好的解决方案是为您的架构引入dependency injection。

最简单的方法是将服务类的实例传递到业务层。 这通常使用构造函数参数在类构造时完成。

 public class BusinessClass { private ISomeServiceClient _svc; public BusinessClass(ISomeServiceClient svc) { _svc = svc; } public void SendData(DataUnit dataUnit) { _svc.SomeMethod(dataUnit); } } 

请注意,上面的代码是一种设计模式,完全不依赖于任何框架,如Inversion of Control容器。

如果贵公司的政策是不使用此类框架(顺便说一句疯狂的政策),您仍然可以在unit testing中手动注入服务的模拟实例。

您应该将业务呼叫与业务层分开:

使用下面的演示,您列出的业务层方法现在看起来像这样:

 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 } }