rspec_controller_helpers

A few bits and pieces to make testing controllers easier

MIT License

Downloads
11.7K
Stars
2
Committers
2

Installation

Add the following to your Gemfile, under the test group

gem 'rspec_controller_helpers', require: false

And add the following in the top of your spec_helper.rb:

require 'rspec_controller_helpers'

Usage

Resourceful Controller

Pre-requisite: You must have a factory set up with the right attributes

This shared example can be used to test the default resourceful rails endpoints.

it_behaves_like 'a resourceful controller', User

By default, it will test all of the following:

Controller Method request Tests
index GET /<resource> The page returns a 200 http status, and it rendering the index template
new GET /<resource>/new The page returns a 200 http status, and it renders the new template
create POST /<resource> The model count changes by 1
show GET /<resource>/:id The page returns a 200 http status, and it renders the show template
edit GET /<resource>/:id/edit The page returns a 200 http status, and it renders the edit template
update PATCH /<resource>/:id All attributes on the object are updated
delete DELETE /<resource>/:id The model count changes by -1

You can disable endpoint tests the same way you would in routes.rb:

# Tests new, create, show, edit, update, and delete
it_behaves_like 'a resourceful controller', User, except: [:index]
# Tests new, create
it_behaves_like 'a resourceful controller', User, only: [:new, :create]

This shared example will also infer your factory name from your model, so if your model is User, it will try create(:user). You can override that with the factory option

it_behaves_like 'a resourceful controller', User, factory: :admin

JSON

By default, the shared example assumes html format for all views, but you can override that for each view, to test json endpoints:

it_behaves_like 'a resourceful controller', User, formats: { index: [:html, :json] }

That will test the following:

Controller Method request Tests
index GET /<resource> The right number of objects is returned
show GET /<resource>/:id The correct attributes are returned

You can also provide the json key value if your data is nested under that controller name:

it_behaves_like 'a resourceful controller', User, formats: { index: [:html, :json] }, json_key: :users

"users":
[
  { ... }
]