【发布时间】:2017-09-03 16:04:18
【问题描述】:
我正在尝试使用 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"}}]
我不太明白。这是一个语法问题(我是一个 ruby 菜鸟),我使用 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 序列化数据方式的错误。
【问题讨论】:
-
因为当数据从你的服务器传输到客户端时,它必须是 JSON 格式。 Javascript 不理解 ruby 哈希。
-
不一定是 JSON。据我了解
Rack::Test将尝试将哈希序列化为表单数据,以防您未指定内容类型。如果它不能“理解”散列,则根本不会有数据到达。在这种情况下,它只是序列化和解码不正确。
标签: ruby rspec sinatra rack rack-test