Ich versuche eine kleine Sinatra-App mit rspec zu testen. Ich möchte eine ziemlich komplexe Nutzlast übergeben und stoße auf Probleme, die ich nicht verstehe: meine Nutzlast enthält eine Reihe von Hashes. Wenn ich die tatsächliche Anwendung ausgeführt wird dies funktionieren wie erwartet, aber wenn ich die post
Helfer verwenden, um meine Tests ausführen, wird das Array eine fusionierte Hash enthalten:Warum wird ein Array in meiner Nutzlast in Sinatra/Rack :: Test abgeflacht?
post(
"/#{bot}/webhook",
sessionId: "test-session-#{session_counter}",
result: {
contexts: [
{ some: 'fixture' },
{ name: 'generic', parameters: { facebook_sender_id: 'zuck-so-cool' } }
]
}
)
Im sinatra Handler I params
verwenden diese Nutzlast zugreifen :
post '/:bot/webhook' do |bot|
do_something_with(params)
end
als ich an der Struktur von params sehen jetzt, wenn die Testsuite ausgeführt wird, werde ich die folgende Struktur sehen:
[{"some" => "fixture", "name" => "generic", "parameters" => {"facebook_sender_id" => "zuck-so-cool"}}]
was ich nicht wirklich verstehe. Ist das ein Syntaxproblem (ich bin ein Ruby Noob), verwende ich params
falsch, oder ist das ein Fehler?
EDIT: So fand ich heraus, dies ist ein „Problem“ mit der Art und Weise, dass Rack::Test
die gegebenen Nutzlast serialisiert werden, wenn sie nicht, wie man (das heißt als Formulardaten) angeben. Wenn ich JSON übergeben und übergeben Sie die richtigen Header wird es das tun, was ich erwarte, dass es zu tun:
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' }
)
Noch bin ich davon nicht sicher ist, ein Problem mit der übergebenen Datenstruktur nicht möglich ist, in Form Daten serialisiert werden oder Wenn dies ein Fehler in der Art ist, dass Rack::Test
Daten serialisiert.
Da, wenn die Daten von Ihrem Server an den Client übertragen werden, muss es in JSON sein. Javascript versteht keinen Ruby Hash. – thesecretmaster
Es muss nicht JSON sein. Von dem, was ich verstehe, wird 'Rack :: Test' versuchen, den Hash in Formulardaten zu serialisieren, falls Sie keinen Inhaltstyp angeben. Wenn es einen Hash nicht "verstehen" würde, würden überhaupt keine Daten ankommen. Es wird nur serialisiert und in diesem Fall falsch decodiert. – m90