单元测试调用wcf服务的方法

问题描述

| 如何对调用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
   }
}