2017-04-08 1 views
2

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.

+0

Da, wenn die Daten von Ihrem Server an den Client übertragen werden, muss es in JSON sein. Javascript versteht keinen Ruby Hash. – thesecretmaster

+0

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

Antwort

Verwandte Themen