【问题标题】:WebService based on an interface for mocking基于接口的 WebService 用于 mocking
【发布时间】:2014-03-06 11:04:24
【问题描述】:

问题背景:

我有两个独立的项目。一个由类和一个测试项目组成,另一个由 Web 服务组成。我想针对 Web 服务实现模拟。

问题:

我有一个对“ProxyHandler”类使用的名为“webService”的网络服务的网络引用,如图所示:

private webService _webServiceObject

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

web服务类实现了一个接口,如图

public class WebServiceClass:IWebService

哪个实现?

  1. 我能否将 Web 引用设为“IWebService”类型?

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

修改后的代理类:

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

【问题讨论】:

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


    【解决方案1】:

    你绝对可以。下面是我使用在 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();
            }
        }    
    }
    

    那么你的单元测试在最小起订量下应该是这样的:

    [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");
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2016-02-03
      • 2012-10-18
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      相关资源
      最近更新 更多