是否可以从WSDL文件生成Ruby SOAP Web服务?

时间:2013-09-19 10:56:02

标签: ruby web-services soap wsdl automated-tests

我的情况如下。我们的测试自动化使用黄瓜实现。被测网站是用.NET编写的。该网站通过单独的.NET WCF SOAP Web服务与数据库交互。在运行每个测试之前,必须使用测试数据填充数据库。

我想伪造这些SOAP Web服务的回复,以便不必与数据库进行交互。

不是从头开始创建重复的Web服务,如果我可以从WSDL文件创建Web服务然后覆盖任何Web服务方法以便它们返回我指定的数据,那将是很好的。

是否有可能用现有的宝石实现这一目标?

1 个答案:

答案 0 :(得分:2)

我创建了自己的基于Savon,Sinatra和Mocha的模拟框架。它可以在https://github.com/kieranmaine/soap_mocker获得。

用法如下。通过传入WSDL URL来实例化模拟服务,指定要使用的服务和端口(在WSDL中)以及运行模拟服务的路径和端口:

service = SoapMocker::MockServiceContainer.new 
    "http://www.webservicex.net/uklocation.asmx?WSDL", 
    "UKLocation", 
    "UKLocationSoap", 
    "/mock/UkLocationSoapService", 
    {:port => 1066}

这将在以下URL上设置模拟服务:

http://localhost:1066/mock/UKLocationSoapService.

然后您需要设置模拟回复:

# Set up responses for valid requests
service.mock_operation "GetUKLocationByPostCode",
  {:GetUKLocationByPostCode => {:PostCode => "SW1A 0AA"}},
  {:GetUKLocationByPostCodeResponse => {:GetUKLocationByPostCodeResult =>     "House Of Commons, London, SW1A 0AA, United Kingdom"}}

# Example of accessing mock object directly.
service.io_mock.stubs(:call_op)
  .with("GetUKLocationByPostCode", regexp_matches(/AL1 4JW/))
  .returns({:GetUKLocationByPostCodeResponse => {:GetUKLocationByPostCodeResult => "TESTING"}})

最后启动模拟Web服务:

service.run