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

时间:2011-05-26 14:48:11

标签: c# wcf unit-testing

如何对调用WCF服务的业务层方法进行单元测试?

示例:

public void SendData(DataUnit dataUnit)
{

        //this is WCF call
        SomeServiceClient svc = new SomeServiceClient();

        svc.SomeMethod(dataUnit);

}

我可以在单元测试项目中模拟SomeServiceClient吗?

2 个答案:

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