WebService基于用于模拟的接口

时间:2014-03-06 11:04:24

标签: c# unit-testing mocking unity-container

问题背景:

我有两个独立的项目。一个包括类和一个测试项目,另一个包含Web服务。我想对Web服务实现模拟。

问题:

我有一个名为'webService'的Web服务的Web引用被类'ProxyHandler'使用,如下所示:

private webService _webServiceObject

 public ProxyHandler(webService webServiceObject)
    {
        _webService = webServiceObject;
    }

Web服务类实现了一个接口,如图所示

public class WebServiceClass:IWebService

哪项实施?:

  1. 我可以将网络引用设为“IWebService”类型吗?

  2. 或者,我是否需要基于使用Web服务的接口简单地实现一个新类,那么这个类本身是由代理实现的?这将允许我模拟界面,如下所示:

  3. 修改后的代理类:

     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>();
    

1 个答案:

答案 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");

    }
}