[英]Mocking a WCF client, with a parameterised constructor for .net component called from COM
我正在努力在这里找到前进的道路。 我有一个VB6屏幕,我需要调用一个.Net“适配器”组件,该组件调出WCF服务。
WCF服务正在Windows身份验证下,因为我想检测调用该功能的用户的Windows登录。 服务参考位于.Net适配器中。 为了使它起作用,我必须在绑定中添加细节,指定安全性,在现实世界中所有这些都可以正常工作。
我的问题是对此进行单元测试,并尝试模拟对WCFServiceClient的调用。 因为我使用的是参数化构造函数,所以Moq不会模拟它。 因此,我相信没有使用我的模拟程序,并且当我运行单元测试时,真正的调用正在传递到WCF层(就是说,我在解决方案中本地运行的wcf服务中设置了一个断点)。
为了简化我的代码,我在其中粘贴了BasicHttpBinding,因为问题不是安全性,它如何重新编码该函数,以便可以模拟调用,或者可以做其他事情让我模拟调用?
在.Net适配器中,在我正在调用的函数中,我具有以下代码
using (var myWcfService = new MyWcfServiceClient(new BasicHttpBinding (), GetEndpointAddress()))
{
//do stuff here
}
在我的单元测试中,我具有以下模拟设置
var mockMyWcfService = new Mock<IMyWcfService>();
这不是创建上面的代码使用的模拟。 如果我将参数类型放入构造函数中,则不会起作用,因为Moq只会模拟一个接口和一个默认的空构造函数(我相信,是通过谷歌搜索我之前的错误)
另外,尽管在解决方案的其他项目中我们使用Unity for IOC,但我不相信我可以在该项目中做到这一点,因为从VB6应用程序调用了.Net适配器,该应用程序没有app.config来指定所有统一配置。
谢谢
如果我对它的理解正确,则您有一个使用MyWcfServiceClient()的类,并且想要在类中控制其生命周期(对using块进行操作),因此无法传递模拟服务。
例如
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
}
}
}
我通常使单元测试构造函数成为内部的-个人喜好,而不是必需的。
在单元测试中,您可以创建一个返回模拟服务的模拟提供程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.