Old Rails 4.2.10行:
post :show, "Some XML as String"
到Rails 5.1.4
post :show, params: { ??? }
那么我在这里添加的键值对是什么?
编辑: 因此,目前在测试中,其编写如下:
let(:logout_request_xml) { "<soap-env:Envelope xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'><soap-env:Body>...more stuff...</soap-env:Body></soap-env:Envelope>" }
...
post :show, logout_request_xml
答案 0 :(得分:1)
这是最小的通过生体的方法:
post :show, as: :xml, headers: { 'RAW_POST_DATA': 'Some XML as String' }
You can't use params
,因为它不应该以这种方式使用,还需要添加as: :xml
,因为您发送的内容是application/x-www-form-urlencoded
的原始正文。
在控制器request.raw_body
答案 1 :(得分:1)
通过在控制器规范的请求中直接设置原始数据,我已经能够使用Rails 5.1.4来发布原始数据
@request.env['RAW_POST_DATA'] = '<test>some raw xml</test>'
post :show
然后在控制器中可以通过request.body.read
进行读取> request.body.read
=> "<test>some raw xml</test>"
请注意,这在移至Rails 5.2时将不起作用。在这种情况下,由于基础行为已更改,因此请求正文将为空。我发现测试此方案的最好方法是使用请求规范而不是控制器规范。
控制器规范-控制器规范是用于Rails功能测试的RSpec包装器。它允许您在每个示例中模拟一个http请求,然后指定预期结果
请求规范-请求规范为Rails的集成测试提供了一个精简的包装,并旨在在整个堆栈中推动行为,包括路由(由Rails提供)而没有存根(由您决定)。
以下是通过请求规范发布相同数据的示例:
post items_path, env: {'RAW_POST_DATA' => "<test>some raw xml</test>"}
在控制器中
> request.body.read
=> "<test>some raw xml</test>"
答案 2 :(得分:0)
以上所有答案均不适用于Rails 5.2.2。
在某些情况下,我需要使用特殊类型的序列化并将所有这些都转换为:
时,在5.1中使用@request.env['RAW_POST_DATA'] = json
这样的代码
json = { "some" => "JSON" }.to_json
post :show, body: json