将Rspec控制器测试从Rails 4.2.10迁移到Rails 5.1.4的问题

时间:2018-09-20 13:51:37

标签: ruby-on-rails ruby-on-rails-4 rspec ruby-on-rails-5

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

3 个答案:

答案 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