rspecのwebmockを使ってXMLRPCのテストをする時にハマったこととか。
どうも。
GW太り真っ最中、P山です。
先日XMLRPCを使用するコマンドをThorで書いていて、
rspecでwebmockを使おうとした際に、activesupportのto_xmlを使って、ハッシュから戻り値を生成すると、
XMLRPCの処理できる形式のxmlが生成されず、上手くいかなかった。
require 'active_support/core_ext/hash/conversions'
require 'yaml'
describe 'add' do
before do
stub_request(:post, "http://api-test.com/host_add").to_return(
{ :body => YAML.load_file('spec/fixtures/test001.yml').to_xml, :status => 200 }
)
end
it 'stdout check' do
expect { Hoge::Host.new.add('ptr', '157.7.190.0/26', '157.7.190.1', 'hoge.com') }.to output(/Add Record/).to_stdout
end
end
end
$ bundle exec rspec spec/
Failure/Error: server.call2(method, params)
RuntimeError:
Missing return value!
具体的には上記エラーがでる。
stackoverflowに同じことはまってる人がいて、
回答を見ると、
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>wm_description</name>
<value>manual create</value>
</member>
…
のような形式で返す必要があるみたいで、
僕がto_xmlで出力していたのは
<?xml version="1.0" encoding="UTF-8"?>
<responseCode>200</responseCode>
<responseMessage>テスト</responseMessage>
…
このような値だった。
でもベタ書きするのダサいし、yamlでスッキリ管理したい思いがあったので、
調べていくと、
before do
stub_request(:post, "http://api-test.com/host_add").to_return(
{ :body => XMLRPC::Create.new.methodResponse(true, YAML.load_file('spec/fixtures/test001.yml')), :status => 200 }
)
end
このように、XMLRPC::Create.new.methodResponse
に対して、responseの正否とハッシュを渡してあげると、
XMLRPCが処理できる形式のXMLが生成され、正常にテストが通るようになった。
ドキュメントに実コード書いてあればもうちょっとわかりやすそうだなぁなんて思ったけど、
わからなかったらソース読む活動が出来たので良いハマりだったっぽい。