2017-04-08 20 views
2

我想用rspec測試一個小的Sinatra應用程序。我想傳遞一個相當複雜的負載,並遇到我不明白的問題:我的負載包含一組哈希值。當我運行的實際應用中,這可以發揮預期的,但是當我使用post助手運行我的測試中,該陣列將包含合併哈希:爲什麼我的有效載荷中的陣列在Sinatra/Rack :: Test中變平了?

post(
    "/#{bot}/webhook", 
    sessionId: "test-session-#{session_counter}", 
    result: { 
    contexts: [ 
     { some: 'fixture' }, 
     { name: 'generic', parameters: { facebook_sender_id: 'zuck-so-cool' } } 
    ] 
    } 
) 

在西納特拉處理我用params訪問此有效載荷:

post '/:bot/webhook' do |bot| 
    do_something_with(params) 
end 

當我現在看則params的結構運行測試套件的時候,我會看到以下結構:

[{"some" => "fixture", "name" => "generic", "parameters" => {"facebook_sender_id" => "zuck-so-cool"}}] 

,我真的不明白。這是一個語法問題(我是一個紅寶石noob),我使用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序列化數據。

+0

因爲當數據從服務器傳輸到客戶端時,必須使用JSON。 Javascript不理解紅寶石哈希。 – thesecretmaster

+0

它不一定是JSON。根據我的理解,'Rack :: Test'將嘗試將散列序列化爲表單數據,以防您不指定內容類型。如果它不「理解」散列,則根本沒有數據到達。它只是在這種情況下序列化和解碼不正確。 – m90

回答

相關問題