添加单元测试用例以测试外部Web服务(.asmx).NET

时间:2013-09-03 05:50:50

标签: c# asp.net .net web-services unit-testing

我已经创建了一个代码来读取外部Web服务,并使用System.Web.Services.ServiceDescription查找公开方法及其参数。 我也可以调用该方法并通过webservice获取输出。 这仅在外部Web服务Url的基础上完成。

一切都是从CodeBehind(C#)完成的。

我需要添加单元测试用例,通过添加虚拟.asmx webservice来测试功能,将通过单元测试访问。

请让我知道或建议我如何动态创建虚拟服务并使用。

1 个答案:

答案 0 :(得分:0)

据我所知,有两位不同的功能主义者:

WSDL提供程序 - 即从某个地方获取有效wsdl的类 WSDL解析器 - 解析wsdl并提取数据的类

这是一个伪代码实现,使它们易于模拟和单元测试。

public interface IWSDLProvider
{
   string GetWsdlFromService(string url);
}

public class MyWsdlProvider : IWSDLProvider
{
   private readonly IWebWrapper _webCLient;

   public MyWsdlProvider(IwebWrapper webClient)
   {
       _webClient = webCLient;
   }

   public string GetWsdlFromService(string url)
   {
      //do here whatever is needed with the webClient to get the wsdl
   }
}

public interface IWSDLParser
{
   MyServiceData GetServiceDataFromUrl(string url);
}

public class MyWsdlParser : IWSDLParser
{
   private readonly IWSDLProvider _wsdlProvider;
   public MyWsdlParser(IWSDLProvider wsdlProvider)
   {
      _wsdlProvider = wsdlProvider;
   }

   public MyServiceData GetServiceDataFromUrl(string url)
   {
      //use the wsdl provder to fetch the wsdl
      //and then parse it
   }
}

The IWebClient is a wrapper around WebClient to allow easy mocking.

使用上述代码的任何模拟框架,您可以轻松地隔离和模拟任何部分,并仅测试手头的行为。这样,您甚至可以让wsdl提供程序的模拟返回您想要测试的任何wsdl。

你可以更进一步包装/隔离System.Web.Services.ServiceDescription调用,这样你就不必在测试中传递一个wsdl,只需处理结果。