How to post JSON data in rails 3 functional test

前端 未结 7 1818
礼貌的吻别
礼貌的吻别 2021-02-04 06:55

I plan to use JSON data in both request and response in my project and having some problems in testing.

After searching for a while, I find the following code which uses

相关标签:
7条回答
  • 2021-02-04 07:22

    Just specify appropriate content type:

    post :index, '{"foo":"bar", "bool":true}', "CONTENT_TYPE" => 'application/json'
    

    Json data should go as a string, not as a Hash. Looking at stack trace running a test you can acquire more control on request preparation: ActionDispatch::Integration::RequestHelpers.post => ActionDispatch::Integration::Session.process => Rack::Test::Session.env_for

    Specifying :format does not work because request go as 'application/x-www-form-urlencoded' and json isn't parsed properly processing a request body.

    0 讨论(0)
  • 2021-02-04 07:30

    I found that this does exactly what I want – post JSON to a controller's action.

    post :create, {:format => 'json', :user => { :email => "test@test.com", :password => "foobar"}}
    
    0 讨论(0)
  • 2021-02-04 07:31

    As of Rails 5, the way to do this is:

    post new_widget_url, as: :json, params: { foo: "bar" }
    

    This will also set the Content-type header correctly (to application/json).

    0 讨论(0)
  • 2021-02-04 07:31

    Here is a snippet that let me post json data to test my own app. rails 3

    port = Rails.env.production? ? 80 : 3000
    uri = URI.parse( Rails.application.routes.url_helpers.books_url(:host => request.host, :port => port, :format => :json) )
    http = Net::HTTP.new(uri.host, uri.port)
    request = Net::HTTP::Post.new(uri.request_uri)
    request.content_type = 'application/json'
    request.body = @json_data
    response = http.request( request )
    @result = response.body
    

    Hope this helps others

    0 讨论(0)
  • 2021-02-04 07:36

    The best answer I can come up with to this is you don't

    Whether or not it was intentional it s maybe good that rails doesn't implement this for you.

    In functional tests you really want to just test your controller and not rails method of deserialization or even that routing and mime detection are all setup correctly, those all fall under an IntegrationTest.

    So for your controllers, don't pass JSON just pass your params hash like you normally would. Maybe adding :format as an argument as well if you need to check that and respond differently.

    If you want to test the full stack move to an IntegrationTest

    0 讨论(0)
  • 2021-02-04 07:42

    Assuming you have a controller named api, a method named new, and you're in the test for the api controller:

    @request.env["RAW_POST_DATA"] = '{ "foo" : "bar" }'
    post :new
    

    did the trick for me.

    0 讨论(0)
提交回复
热议问题