模拟WCF客户端,使用从COM调用的.net组件的参数化构造函数

时间:2013-08-20 20:02:33

标签: c# .net wcf unit-testing moq

我在努力寻找前进的方向。 我有一个VB6屏幕,我需要调用一个.Net'适配器'组件,它调用一个WCF服务。
WCF服务在Windows身份验证下,因为我想检测调用该功能的用户的Windows登录。 服务引用位于.Net适配器中。为了实现这一点,我必须为绑定添加细节,指定安全性,这在现实世界中都可以正常工作。

我的问题是对此进行单元测试,并尝试模拟对WCFServiceClient的调用。因为我使用的是参数化构造函数,所以Moq不会嘲笑它。所以我相信我的模拟因此没有被使用,当我运行我的单元测试时,真正的调用将进入WCF层(它是,我在我的解决方案中在本地运行的wcf服务中设置了一个断点)。 / p>

为了简化我的代码,我已经粘贴了一个BasicHttpBinding,因为问题不是安全性,它如何重新编码函数以便我可以模拟调用,或者我可以做其他事情让我模拟调用? / p>

在.Net适配器中,在我调用的函数中,我有以下代码

using (var myWcfService = new MyWcfServiceClient(new BasicHttpBinding (), GetEndpointAddress()))
    {
    //do stuff here
    }

在我的单元测试中,我有以下模拟设置

var mockMyWcfService = new Mock<IMyWcfService>();

这不是创建上述代码使用的模拟。 如果我将参数类型放入构造函数中,那么这不起作用,因为Moq只会模拟一个接口,并且是一个默认的空构造函数(我相信,通过谷歌搜索我之前的错误)

此外,虽然在解决方案的其他项目中我们使用Unity for IOC,我不相信我可以在这个项目中这样做,因为.Net适配器是从VB6应用程序调用的,它没有app.config供我使用指定所有的统一配置。

由于

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你有一个使用MyWcfServiceClient()的类,你想控制它在你的类中的生命周期(使用块),因此你无法传入模拟服务。

e.g。

public interface IMyWcfService {
    void DoSomething();
}

public class MyClass {
    private readonly IMyWcfService myService;

    public MyClass(IMyWcfService myService) {
        this.myService = myService;
    }

    public void DoIt() {
        myService.DoSomething();
    }
}    

您可以尝试使用提供程序创建服务并将其传递并使用默认提供程序在未进行单元测试时生成服务。

e.g。

public interface IService : IDisposable {
}

public class DefaultService : IService {
    public void Dispose() {
    }
}

public interface IServiceProvider {
    IService GetService();
}

public class DefaultServiceProvider : IServiceProvider {
    public IService GetService() {
        return new DefaultService();
    }
}

public class Consumer {

    private readonly IServiceProvider serviceProvider;

    public Consumer() : this (new DefaultServiceProvider()){
    }

    internal Consumer(IServiceProvider serviceProvider) {
        this.serviceProvider = serviceProvider;
    }


    public void DoIt() {
        using (var service = serviceProvider.GetService()) {
          // do stuff                               
        }
    }

}

我通常将单元测试构造函数设置为内部 - 个人偏好,不是必需的。
在单元测试中,您可以创建一个返回模拟服务的模拟提供程序。