为什么我的有效负载中的数组在Sinatra / Rack :: Test中被展平?

时间:2017-04-08 09:11:37

标签: ruby rspec sinatra rack rack-test

我正在尝试使用rspec测试一个小的Sinatra应用程序。我想传递一个相当复杂的有效载荷并遇到我不理解的问题:我的有效载荷包含一系列哈希。当我运行实际的应用程序时,这将按预期工作,但当我使用post帮助程序运行我的测试时,该数组将包含一个合并的哈希:

post(
  "/#{bot}/webhook",
  sessionId: "test-session-#{session_counter}",
  result: {
    contexts: [
      { some: 'fixture' },
      { name: 'generic', parameters: { facebook_sender_id: 'zuck-so-cool' } }
    ]
  }
)

在sinatra处理程序中,我使用params来访问此有效负载:

post '/:bot/webhook' do |bot|
  do_something_with(params)
end

当我现在在运行测试套件时查看params的结构时,我将看到以下结构:

[{"some" => "fixture", "name" => "generic", "parameters" => {"facebook_sender_id" => "zuck-so-cool"}}]

我真的不明白。这是一个语法问题(我是一个红宝石菜鸟),我使用params错了,还是这个错误?

编辑:所以我发现这是一个“问题”,Rack::Test将在未指定如何(即作为表单数据)时序列化给定的有效负载。如果我传递JSON并传递正确的标题,它将按照我的预期执行:

post(
  "/#{bot}/webhook",
  {
      sessionId: "test-session-#{session_counter}",
      result: {
        contexts: [
          { some: 'fixture' },
          { name: 'generic', parameters: { facebook_sender_id: 'zuck-so-cool' } }
        ]
      }
  }.to_json,
  { 'HTTP_ACCEPT' => 'application/json', 'CONTENT_TYPE' => 'application/json' }
)

我仍然不确定这是一个问题,传递的数据结构无法序列化为表单数据,或者这是Rack::Test序列化数据的方式中的错误。

1 个答案:

答案 0 :(得分:1)

查看the relevant portion of the specs看起来这是预期的行为。