我的情况如下。我们的测试自动化使用黄瓜实现。被测网站是用.NET编写的。该网站通过单独的.NET WCF SOAP Web服务与数据库交互。在运行每个测试之前,必须使用测试数据填充数据库。
我想伪造这些SOAP Web服务的回复,以便不必与数据库进行交互。
不是从头开始创建重复的Web服务,如果我可以从WSDL文件创建Web服务然后覆盖任何Web服务方法以便它们返回我指定的数据,那将是很好的。
是否有可能用现有的宝石实现这一目标?
答案 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