Ruby on rails 3 stubxmlrpc::带有rspec的rails测试中的客户端调用
我正在尝试在rails中的rspec测试中存根XMLRPC::Client.call 以下是我的方法:Ruby on rails 3 stubxmlrpc::带有rspec的rails测试中的客户端调用,ruby-on-rails-3,unit-testing,rspec,xml-rpc,webmock,Ruby On Rails 3,Unit Testing,Rspec,Xml Rpc,Webmock,我正在尝试在rails中的rspec测试中存根XMLRPC::Client.call 以下是我的方法: def xmlrpc_call(location, repeat, func, *args) Rails.logger.debug("XML_RPC: calling #{func}(#{args.inspect})") timeout = XMLRPC_TIMEOUT ? XMLRPC_TIMEOUT : 90 begin server =
def xmlrpc_call(location, repeat, func, *args)
Rails.logger.debug("XML_RPC: calling #{func}(#{args.inspect})")
timeout = XMLRPC_TIMEOUT ? XMLRPC_TIMEOUT : 90
begin
server = XMLRPC::Client.new2(location, nil, timeout)
result = server.call(func, *args)
rescue XMLRPC::FaultException => e
Rails.logger.error "XMLRPC FaultException: #{e.faultCode}, Exception: #{e.faultString}"
log_abp_error("#{func}: #{e.faultCode} (wrapper, rescue 1, try: #{(repeat ? "1":"2")})")
@xmlrpc_exception = e
false
end
result
end#xmlrpc_call
以下是我的测试:
describe "#xmlrpc_call" do
it 'should return success' do
stub_request(:post, "http://google.com/RPC2").
with(:body => "<?xml version=\"1.0\" ?><methodCall> <methodName>CallGoogle</methodName><params><param><value><string>foo</string></value></param><param><value><string>bar</string></value></param></params></methodCall>\n",
:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'keep-alive', 'Content-Length'=>'200', 'Content-Type'=>'text/xml; charset=utf-8', 'User-Agent'=>'XMLRPC::Client (Ruby 2.1.1)'}).
to_return(:status => 200, :body => "success", :headers => {})
XmlRpcCallHelper.xmlrpc_call("http://google.com", true, "CallGoogle", "foo", "bar")
end#success
end#xmlrpc_call
如果我在存根中使用空响应体,我将得到:
Failure/Error: XmlRpcCallHelper.xmlrpc_call("http://google.com", true, "CallGoogle", "foo", "bar")
NoMethodError:
undefined method `bytesize' for nil:NilClass
这对我也不管用
非常感谢您的帮助。
谢谢 这段代码对我很有用:
context "success" do
before do
stub_request(:post, "http://srv476.offsidebet.com:8080/abp/webApiXmlRpcServlet").
with(:body => "<?xml version=\"1.0\" ?><methodCall><methodName>func</methodName><params><param><value><string>a</string></value></param><param><value><string>b</string></value></param><param><value><string>c</string></value></param></params></methodCall>\n",
:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Connection'=>'keep-alive', 'Content-Length'=>'238', 'Content-Type'=>'text/xml; charset=utf-8', 'User-Agent'=>'XMLRPC::Client (Ruby 2.1.1)'}).
to_return(:status => 200, :body => File.read("#{Rails.root}/spec/fixtures/xml_rpc_call_helper/response_ok.xml"), :headers => {})
end
let(:response){ {"wm_description"=>"manual create", "wm_ticket_number"=>"1408171142773", "ABPBuildNumber"=>"436 r${svn.Revision}", "wm_payment_number"=>"41902112", "wm_sim_mode"=>"0", "wm_redirect_url"=>"https://exmaple.com/entrypoint", "WEBAPIVersionNumber"=>"0.57", "wm_purse"=>"12345"} }
it {XmlRpcCallHelper.xmlrpc_call(XML_RPC_LOCATION, true, 'func', 'a','b','c').should eq(response)}
end#success
上下文“成功”是什么
在做之前
存根请求(:post,“http://srv476.offsidebet.com:8080/abp/webApiXmlRpcServlet").
使用(:body=>“funcabc\n”,
:headers=>{'Accept'=>'*/*','Accept Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3','Connection'=>'keep-alive','Content Length'=>'238','Content Type'=>'text/xml;charset=utf-8','User-Agent'=>'XMLRPC::Client(Ruby 2.1.1)})。
返回(:status=>200,:body=>File.read(“#{Rails.root}/spec/fixtures/xml\u rpc\u call\u helper/response\u ok.xml”),:headers=>
结束
let(:response){“wm_description”=>“manual create”,“wm_ticket_number”=>“1408171142773”,“ABPBuildNumber”=>“436 r${svn.Revision}”,“wm_payment_number”=>“41902112”,“wm_sim_mode”=>“0”,“wm_redirect_url”=>”https://exmaple.com/entrypoint“,“WebAPVersionNumber”=>“0.57”,“wm_钱包”=>“12345”}”
它{XmlRpcCallHelper.xmlrpc_调用(XML_RPC_位置,true,'func','a','b','c')。应该eq(响应)}
结束#成功
固定装置:
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>wm_description</name>
<value>manual create</value>
</member>
<member>
<name>wm_ticket_number</name>
<value>1408171142773</value>
</member>
<member>
<name>ABPBuildNumber</name>
<value>436 r${svn.Revision}</value>
</member>
<member>
<name>wm_payment_number</name>
<value>41902112</value>
</member>
<member>
<name>wm_sim_mode</name>
<value>0</value>
</member>
<member>
<name>wm_redirect_url</name>
<value>https://exmaple.com/entrypoint</value>
</member>
<member>
<name>WEBAPIVersionNumber</name>
<value>0.57</value>
</member>
<member>
<name>wm_purse</name>
<value>12345</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
wm_描述
手工创建
车票号码
1408171142773
ABPBuildNumber
436 r${svn.Revision}
wm_付款编号
41902112
wm_sim_模式
0
wm_重定向_url
https://exmaple.com/entrypoint
WEBAPIVersionNumber
0.57
钱包
12345
使用此代码创建响应
before do
stub_request(:post, "http://api-test.com/host_add").to_return(
{ :body => XMLRPC::Create.new.methodResponse(true, { hoge: "test"} ), :status => 200 }
)
end
XMLRPC::Create.new.methodResponse
是对xml的哈希
before do
stub_request(:post, "http://api-test.com/host_add").to_return(
{ :body => XMLRPC::Create.new.methodResponse(true, { hoge: "test"} ), :status => 200 }
)
end