C# 使用从COM调用的.net组件的参数化构造函数模拟WCF客户端
我正在努力寻找前进的道路。 我有一个VB6屏幕,我需要调用.Net“适配器”组件,它调用WCF服务。C# 使用从COM调用的.net组件的参数化构造函数模拟WCF客户端,c#,.net,wcf,unit-testing,moq,C#,.net,Wcf,Unit Testing,Moq,我正在努力寻找前进的道路。 我有一个VB6屏幕,我需要调用.Net“适配器”组件,它调用WCF服务。 WCF服务正在进行windows身份验证,因为我想检测调用该功能的用户的windows登录。 服务引用位于.Net适配器中。为了实现这一点,我必须向绑定中添加细节,指定安全性,这在现实世界中都可以正常工作 我的问题是对此进行单元测试,并尝试模拟对WCFServiceClient的调用。因为我使用的是参数化构造函数,所以Moq不会模拟它。因此,我相信我的mock没有被使用,当我运行单元测试时,一个
WCF服务正在进行windows身份验证,因为我想检测调用该功能的用户的windows登录。 服务引用位于.Net适配器中。为了实现这一点,我必须向绑定中添加细节,指定安全性,这在现实世界中都可以正常工作 我的问题是对此进行单元测试,并尝试模拟对WCFServiceClient的调用。因为我使用的是参数化构造函数,所以Moq不会模拟它。因此,我相信我的mock没有被使用,当我运行单元测试时,一个真正的调用正在通过WCF层(实际上,我在解决方案中本地运行的WCF服务中设置了一个断点) 为了简化我的代码,我在其中粘贴了一个BasicHttpBinding,因为问题不在于安全性,而在于我如何重新编码函数以便模拟调用,或者我可以做一些其他允许我模拟调用的事情吗 在.Net适配器中,在我调用的函数中,我有以下代码
using (var myWcfService = new MyWcfServiceClient(new BasicHttpBinding (), GetEndpointAddress()))
{
//do stuff here
}
在我的单元测试中,我有以下模拟设置
var mockMyWcfService = new Mock<IMyWcfService>();
var mockMyWcfService=new Mock();
这不是创建一个供上述代码使用的模拟。
如果我将参数类型放入构造函数,这也不起作用,因为Moq只会模拟一个接口和一个默认的空构造函数(我相信,通过谷歌搜索我以前的错误)
此外,尽管在解决方案中的其他项目中我们使用Unity for IOC,但我不相信我可以在这个项目中这样做,因为.Net适配器是从VB6应用程序调用的,该应用程序没有app.config供我指定所有Unity配置
谢谢如果我理解正确,您有一个使用MyWcfServiceClient()的类,并且您希望在您的类中控制它的生存期(使用块),因此您不能传入模拟服务 e、 g 您可以尝试使用提供程序来创建服务,并将其传入,在不进行单元测试时使用默认提供程序来生成服务 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();
}
}
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
}
}
}