I'm working on a rails API and I'm now planning on writing some RSpec tests for the controllers. I've been reading around and I haven't been able to figure out what the actual difference between controller specs and request specs are and which one I should probably use if I'm testing an API.
-
3If I were you, I'd forego controller specs in favor of request/integration specs. – Sergio Tulentsev Nov 28 '16 at 19:11
-
2If anyone reads the above comment and wonders "why request/integration specs over controller specs?", I wrote about that [here](https://www.codewithjason.com/use-controller-request-specs-rails-dont/). – Jason Swett Mar 13 '19 at 19:14
3 Answers
Indeed, the RSpec team officially states controller specs are now obsolete.
http://rspec.info/blog/2016/07/rspec-3-5-has-been-released/
For new Rails apps: we don't recommend adding the rails-controller-testing gem to your application. The official recommendation of the Rails team and the RSpec core team is to write request specs instead. Request specs allow you to focus on a single controller action, but unlike controller tests involve the router, the middleware stack, and both rack requests and responses. This adds realism to the test that you are writing, and helps avoid many of the issues that are common in controller specs. In Rails 5, request specs are significantly faster than either request or controller specs were in rails 4, thanks to the work by Eileen Uchitelle1 of the Rails Committer Team.

- 2,958
- 4
- 33
- 51
Rails 3 & 4
Controller specs - A controller spec is an RSpec wrapper for a Rails functional test. It allows you to simulate a single http request in each example, and then specify expected outcomes
Request specs - Request specs provide a thin wrapper around Rails' integration tests, and are designed to drive behavior through the full stack, including routing (provided by Rails) and without stubbing (that's up to you).
So if you want to test API controllers I would recommend to use Controller specs
as you are testing single requests.
Rails 5+
Rails 5 improved the speed and realism of request specs over Rails version 4's controller and request specs. The official recommendation of the Rails team and the RSpec core team is to write request specs instead (of controller specs).

- 6,569
- 6
- 41
- 45

- 734
- 1
- 6
- 8
-
5If you're using older versions of Rails, then the general recommended code styles seem to be towards controller specs. Rails 5 has changed how controller tests work; they're integration tests and you can no longer access the internals of the controller. It's now not clear to me if there is any point in having controller tests at all. Request and Feature specs seem to be the recommended approach for future development. https://everydayrails.com/2016/09/05/replace-rspec-controller-tests.html – CJBrew Jan 05 '17 at 15:09
-
I'm having an issue about whether or not to unit test controllers by just calling the action directly and not using the http layer. Is this recommended? – Jwan622 Mar 25 '17 at 21:39
Quoting Aaron Sumner:
Both the Rails and RSpec teams suggest replacing or removing your app’s controller tests (also known as the functional test layer), in favor of directly testing models (units), or with higher-level integration tests.
For a new API, I prefer to use request spec and hit my "end points" (aka Models and Business logic) than using controller tests.

- 2,183
- 2
- 20
- 34