Почему массив в моей полезной нагрузке сглаживается в Sinatra / Rack::Test?

Я пытаюсь протестировать небольшое приложение Sinatra с помощью rspec. Я хочу передать довольно сложную полезную нагрузку и сталкиваюсь с проблемами, которые не понимаю: моя полезная нагрузка содержит массив хэшей. Когда я запускаю реальное приложение, оно будет работать как положено, но когда я использую 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

Когда я сейчас посмотрю на структуру параметров при запуске набора тестов, я увижу следующую структуру:

[{"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 ответ

Решение

Глядя на соответствующую часть спецификаций, похоже, что это ожидаемое поведение.

Другие вопросы по тегам