2013-09-08 139 views
9

Đây là một vấn đề đã làm phiền tôi một thời gian. Tôi đang xây dựng một hàm API sẽ nhận dữ liệu trong json và đáp ứng trong json. Kiểm tra điều khiển của tôi chạy tốt (Vì tôi trừu tượng rằng dữ liệu được giải mã đã có từ JSON và chỉ câu trả lời cần được giải thích).Rails Kiểm tra API JSON Yêu cầu POST với PARAMS trong JSON

Tôi cũng biết rằng hàm hoạt động tốt vì tôi đã sử dụng curl để kiểm tra nó với các đối số JSON và nó hoạt động hoàn hảo. (ví dụ: curl -i --header "Chấp nhận: application/json" --header "Content-Type: application/json" -d '{"test": {"email": "[email protected]"} Nhưng rõ ràng là tôi muốn viết các yêu cầu (tính năng) để kiểm tra điều này một cách tự động và cách tôi thấy nó sẽ hoạt động chính xác như curl, tức là, nhấn dịch vụ của tôi giống như một cuộc gọi bên ngoài. Điều đó có nghĩa là tôi muốn chuyển các đối số trong JSON và nhận được câu trả lời. Tôi khá lạc lõng vì tất cả các ví dụ tôi có thể thấy mọi người đối xử với các đối số vì nó đã được giải mã.

Câu hỏi của tôi là: Tôi đang tuân theo một tiền đề sai khi muốn gửi các đối số và yêu cầu dưới dạng JSON vì tôi sẽ kiểm tra xem đường ray có hoạt động hay không, vì đây là trách nhiệm của nó? Nhưng tôi muốn thấy mã của tôi mạnh mẽ như thế nào để lập luận sai và muốn thử với JSON.

một cái gì đó thuộc loại này:

it "should return an error if there is no correct email" do 
    params = {:subscription => {:email => "andre"}} 

    post "/magazine_subscriptions", { 'HTTP_ACCEPT' => "application/json", 'Content-Type' => 'application/json', 'RAW_POST_DATA' => params.to_json } 
end 

Bạn có biết cách này là có thể? và xin vui lòng cho tôi biết nếu bạn nghĩ rằng tôi đang thử nghiệm nó sai.

mọi điều tốt đẹp,

Andre

Trả lời

17

Tôi tìm thấy câu trả lời của tôi trên một bài đăng ở đây (RSpec request test merges hashes in array in POST JSON params), tôi nghĩ rằng những gì tôi đã làm sai liên quan các đối số theo yêu cầu.

để làm việc này:

it "should return an error if there is no correct email" do 
    params = {:subscription => {:email => "andre"}} 

    post "/magazine_subscriptions", params.to_json, {'ACCEPT' => "application/json", 'CONTENT_TYPE' => 'application/json'} 
end 
+5

Để ngắn gọn, viết nó như 'bài '/ magazine_subscriptions', params.to_json, định dạng:: json'. – user664833

+0

@ user664833 đó là thanh lịch hơn – Tudorizer

+2

Tôi không nghĩ rằng .to_json là cần thiết nếu bạn đã định dạng nó như là một đối tượng json. Tôi nghĩ rằng nó nên là 'post'/magazine_subscriptions ', params, format:: json' –

1
describe '#create' do 
    let(:email) {'andre'} 
    let(:attrs) {{email: email}} 
    let(:params) {{format: :json, subscription: attrs}} 

    it "should return an error if there is no correct email" do 
    post "/magazine_subscriptions", params 
    end 
end 
+1

Cảm ơn vì điều này. Tôi đã có một thời gian khó tìm một ví dụ cho các phiên bản gần đây của đường ray. 'post"/magazine_subscriptions ", đăng ký: subscription_params, định dạng:: json' là chìa khóa cho tôi. Không có 'to_json' cần thiết. – jrhorn424