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

本文关键字:net 组件 参数 构造函数 调用 COM 客户端 WCF 模拟 | 更新日期: 2023-09-27 18:28:20

我正在努力寻找前进的道路。我有一个VB6屏幕,我需要调用.Net"适配器"组件,该组件调用WCF服务
WCF服务正在进行windows身份验证,因为我想检测调用该功能的用户的windows登录。服务引用位于.Net适配器中。为了实现这一点,我不得不为绑定添加细节,指定安全性,这在现实世界中都很好。

我的问题是对其进行单元测试,并试图模拟对WCFServiceClient的调用。因为我使用的是参数化构造函数,Moq不会对其进行mock。所以我相信我的mock因此没有被使用,并且当我运行单元测试时,一个真正的调用正在传递到WCF层(也就是说,我在解决方案中本地运行的WCF服务中设置了一个断点)。

为了简化我的代码,我在中粘贴了一个BasicHttpBinding,因为问题不在于安全性,而是我如何重新编码函数以便模拟调用,或者我可以做一些其他事情来模拟调用?

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

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

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

var mockMyWcfService = new Mock<IMyWcfService>();

这并不是创建一个被上面的代码使用的mock。如果我在构造函数中放入参数类型,这也不起作用,因为Moq只会模拟一个接口和一个默认的空构造函数(我相信,从谷歌上搜索我以前的错误)

此外,尽管在解决方案的其他项目中,我们使用Unity for IOC,但我不相信我能在这个项目中做到这一点,因为.Net适配器是从VB6应用程序调用的,该应用程序没有app.config供我指定所有的Unity配置。

感谢

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

如果我理解正确,您有一个使用MyWcfServiceClient()的类,并且您希望在您的类中控制它的生存期(遍历使用块),因此您不能传入模拟服务。

例如

public interface IMyWcfService {
    void DoSomething();
}
public class MyClass {
    private readonly IMyWcfService myService;
    public MyClass(IMyWcfService myService) {
        this.myService = myService;
    }
    public void DoIt() {
        myService.DoSomething();
    }
}    

您可以尝试使用一个提供程序来创建服务,并将其传入,然后在不进行单元测试时使用默认提供程序来生成服务。

例如

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

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