Skip to content

Instantly share code, notes, and snippets.

@dteoh
Created July 12, 2016 07:33
Show Gist options
  • Save dteoh/2d4c115446e2429824b6945c45c07f3b to your computer and use it in GitHub Desktop.
Save dteoh/2d4c115446e2429824b6945c45c07f3b to your computer and use it in GitHub Desktop.
PUT or POST JSON in a Rails 5 ActionDispatch::IntegrationTest

In Rails 5, the preferred base class for testing controllers is ActionDispatch::IntegrationTest.

If you have an API that receives parameters as JSON request bodies, here are some helper methods to facilitate testing:

class ActionDispatch::IntegrationTest
  def put_json(path, obj)
    put path, params: obj.to_json, headers: { 'CONTENT_TYPE' => 'application/json' }
  end

  def post_json(path, obj)
    post path, params: obj.to_json, headers: { 'CONTENT_TYPE' => 'application/json' }
  end
end

Sample usage:

class MyControllerTest < ActionDispatch::IntegrationTest
  test 'creating a foo' do
    post_json foos_path, foo: { attr_1: 'bar', attr_2: 'baz' }
    assert_response :created
  end
end
@zoe-edwards
Copy link

Thanks for this – exactly what I was looking for.

@mrhead
Copy link

mrhead commented Jul 31, 2018

You don't have to set content type manually, instead of that you can use as: option:

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

@qrush
Copy link

qrush commented Jan 22, 2019

This was helpful thanks!

@wxgeorge
Copy link

wxgeorge commented Mar 29, 2019

👍 to as: :json.

I have been searching for this for a long time!

👍 @mrhead!!

@BugBuster99
Copy link

This was helpful!!! Thankss!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment