gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:06 26 4
gpt4 key购买 nike

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

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

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

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

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

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

var mockMyWcfService = new Mock<IMyWcfService>();

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

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

谢谢

最佳答案

如果我理解正确的话,你有一个使用 MyWcfServiceClient() 的类并且你想在你的类中控制它的生命周期(因此使用 using block )因此你不能传递模拟服务。

例如

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

}

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

关于c# - 模拟 WCF 客户端,使用从 COM 调用的 .net 组件的参数化构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18344027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com