Почему массив в моей полезной нагрузке сглаживается в 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 ответ
Глядя на соответствующую часть спецификаций, похоже, что это ожидаемое поведение.