问题背景:
我有两个独立的项目。一个包括类和一个测试项目,另一个包含Web服务。我想对Web服务实现模拟。
的问题: 的
我有一个名为'webService'的Web服务的Web引用被类'ProxyHandler'使用,如下所示:
private webService _webServiceObject
public ProxyHandler(webService webServiceObject)
{
_webService = webServiceObject;
}
Web服务类实现了一个接口,如图所示
public class WebServiceClass:IWebService
哪项实施?:
我可以将网络引用设为“IWebService”类型吗?
或者,我是否需要基于使用Web服务的接口简单地实现一个新类,那么这个类本身是由代理实现的?这将允许我模拟界面,如下所示:
修改后的代理类:
private webService _webServiceHandlerObject;
public ProxyHandler(IwebServiceHandler webServiceHandlerObject)
{
_webServiceHandlerObject = webServiceHandlerObject;
}
添加了'WebServiceHandlerObject:
private webService _webServiceObject;
public Class WebServiceHandler:IwebServiceHandler
public WebServiceHandler(webService webServiceObject)
{
_webServiceObject = webServiceObject;
}
给予:
var proxy = new ProxyHandler(new WebServiceHandler(new webService()));
var mockedProxy = newMock<IwebServiceHandler>();
答案 0 :(得分:0)
你绝对可以。下面是我使用在Visual Studio中创建的服务引用创建的示例。在此示例中,USZipSoap
是Web服务接口,USZipSoapClient
是实现类。这一切都是开箱即用的。通常,您需要对服务进行一些配置,因此下面演示了如何使用Unity的工厂方法来解决依赖关系。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ClassLibrary3.MyService;
using Microsoft.Practices.Unity;
namespace ClassLibrary3
{
public class ProxyHandler
{
public USZipSoap iwebService { get; set; }
public ProxyHandler(USZipSoap iWebService)
{
this.iwebService = iWebService;
}
public string GetZipInfo()
{
return iwebService.GetInfoByZIP("20008").InnerXml;
}
public static IUnityContainer BootstrapContainer()
{
var container = new UnityContainer();
//Simple Registration
//container.RegisterType<USZipSoap, USZipSoapClient>("Simple", new InjectionConstructor(new object[0]));
//Factory registration
container.RegisterType<USZipSoap>(new InjectionFactory(c => ProxyHandler.CreateSoapClient()));
return container;
}
public static USZipSoap CreateSoapClient()
{
var client = new USZipSoapClient();
/*Configure your client */
return client;
}
public static void Main()
{
var container = ProxyHandler.BootstrapContainer();
var proxy2 = container.Resolve<USZipSoap>();
var proxy1 = container.Resolve<ProxyHandler>();
Console.WriteLine(proxy1.GetZipInfo());
Console.ReadLine();
}
}
}
然后你的单元测试看起来像是Moq:
[global:Microsoft.VisualStudio.TestTools.UnitTesting.TestClass]
public class MyTestClass
{
[global::Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
public void MyTestMethod()
{
//Arrange
var mock = new Mock<USZipSoap>();
var proxy = new ProxyHandler(mock.Object);
//Act
var result = proxy.GetZipInfo();
//Assert
mock.Verify(m => m.GetInfoByZIP("20008"), Times.Once, "Error");
}
}