【问题标题】:Problem with Migrating Rspec Controller Tests from Rails 4.2.10 to Rails 5.1.4将 Rspec 控制器测试从 Rails 4.2.10 迁移到 Rails 5.1.4 的问题
【发布时间】:2018-09-20 13:51:36
【问题描述】:

旧 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

【问题讨论】:

  • 你试过post :show, params: "Some XML as String"吗?
  • 是的,NoMethodError: undefined method `symbolize_keys' for "Some XML as String":String
  • 你是如何在你的控制器中处理你的"Some XML as String" 的? params 应该是一个哈希
  • 我更详细地添加了它当前在 4.2.10 下的工作方式。
  • 控制器用Nokogiri处理xml,通过request.body.read获取

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


【解决方案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】:

    以上答案在 Rails 5.2.2 中都不适合我。

    我在 5.1 中使用类似 @request.env['RAW_POST_DATA'] = json 这样的代码,在某些情况下我需要一种特殊类型的序列化,我将所有这些转换为:

    json = { "some" => "JSON" }.to_json
    post :show, body: json
    

    【讨论】:

    • 这也是几十次尝试中唯一对我有用的东西。
    【解决方案3】:

    这是在 minitest 中传递原始 body 的方法:

    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

    【讨论】:

    • 它说 ArgumentError: unknown keyword: headers.
    • 它是新 Rails 版本的有效语法,我也测试过它,它按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    相关资源
    最近更新 更多