If it’s that black-and-white that Request specs are to be preferred over 
Controller Specs, you should consider reflecting that in the documentation on 
RSpec Controller Specs. Right now, Controller Specs are documented very much 
the way they would have been before this debate appeared (and certainly before 
the moves were made by Rails to move away from controller tests). In fact, two 
of the four examples in the introduction to Controller Specs are about rendered 
templates and controller instance variables. (BTW, the Request Spec overview 
also mentions #render_template.)

Personally, I really drank the koolaid on controller tests. What I have done 
with Controller Specs is to focus on making sure that I test every piece of 
code that is in the Controller to ensure that they do what is expected of them, 
and the existence of robust controller specs has allowed me to discover and 
resolve a number of breaking changes when I upgraded Ruby and/or Rails (which, 
if you’ve been following my saga, is both numerous and ongoing — I started at 
Ruby 2.0 and Rails 3.2, and have made it up to Ruby 2.4/Rails 5.1 with a target 
of 2/7/6.1). While a request spec will likely find a problem in your program’s 
behavior (if you’ve figured out enough of the logic to drive all the different 
paths through the code, which is not trivial when you’re focusing on the big 
picture of the request), the controller specs were excellent at pinpointing 
exactly the source of a problem, and therefore led to a quick fix. In 
Controller tests, I stub out almost everything not in the controller, so that 
it really is like a controller unit test.

Summarizing my approach, I have built unit tests for just about every class 
(including miscellaneous code in the lib folder and initializers). Then I built 
(or will build) system specs that focus on both testing the JS and the 
end-to-end functioning of the pages. I’d prefer to test the JS in more of a 
unit-test fashion, but there really isn’t a way to do that (that I know of).

But if you’re saying that the writing is on the wall about Controller tests, I 
guess I will start moving towards request specs in their place. Since most of 
the controller instance variables exist to affect the template behavior, I will 
turn tests involving assigns and rendered templates into tests of exactly what 
was rendered in the page, even though that is an indirect test of the code that 
establishes the value of the instance variable.

This is one of those places where Rails being opinionated isn’t a good thing 
for me - I happen to disagree with the opinion. ;)

Regards,

Jack

> On Dec 6, 2020, at 2:42 AM, Jon Rowe <[email protected]> wrote:
> 
> Some clarifications that might help your deliberations:
> 
> `rspec-rails` maintains controller specs as a parallel to controller tests, 
> with the intention that if you wish to continue to use them you bring in the 
> `rails-controller-test` gem.
> 
> We recommend request specs rather than controller specs for the same reasons 
> the Rails team does, thus it is likely rspec-rails will remove support for 
> controller specs at the same time Rails does.
> 
> Controller specs were always a bit weird, pretending to be unit tests when in 
> fact they were a set of limited integration tests with introspection into the 
> internals of a controller, I would never recommend asserting on assigns in a 
> controller.
> 
> Cheers
> Jon
> ----------------
> [email protected]
> https://jonrowe.co.uk
> 
> On 30 November 2020 at 17:05, Phil Pirozhkov wrote:
>>> In Rails 5, the team changed controller tests to effectively be integration 
>>> tests (use URLs instead of actions), don’t test controller instance 
>>> variables, don’t test what template is rendered, etc. Instead, you should 
>>> test the contents of the page for specifics that indicate the request 
>>> completed as expected.
>>> 
>>> With RSpec (at least with 3.1), controller tests in Rails 5 are still based 
>>> on the old unit test (Test::Case). So I’m wondering where I should go here?
>> As far as I remember, they still are even in rspec-rails 4.0.
>>  
>>> It should be noted that I’m just "passing through” Rails 5 on my way to 
>>> Rails 6 (or at least 5.2), as that may affect the answer to my question.
>>> 
>>> Here are some of the alternatives I can think of:
>>> 1) Stay with current software, use the "rails-controller-testing” to 
>>> restore template and assigns testing, and leave it alone for a future 
>>> release.
>>> 2) Stay with current software, rewrite all of the controller specs as 
>>> request specs (and abandon the controller specs).
>>> 3) Upgrade to a newer version of RSpec that treats controller specs as 
>>> request specs (does this even exist?) and rework the controller specs to 
>>> follow the rules of request specs.
>> 
>> Depends on how frequently `assigns` and `assert_template`.
>> As you have a different goal, and `rails-controller-testing` is extracted 
>> and pretty well maintained, I guess you have better investment for your time 
>> than to rewrite specs that work.
>> 
>>> version of RSpec that treats controller specs as request specs (does this 
>>> even exist?)
>> It doesn't to my best knowledge.
>> 
>>> There are a couple questions that inform this answer, and perhaps deserve 
>>> to be answered in their own right:
>>> 
>>> 1) When all is said and done, what is the position of the RSpec team 
>>> regarding controller specs vs. request specs?
>> Controller specs are sometimes used as requests specs, and this lets you 
>> easily shot you in your foot. I've just recently seen several `get` calls in 
>> a single example, and memoization in the controller that remained between 
>> those requests.
>> Rails core team worked hard to make request specs fast. I don't see any 
>> reason not to use them.
>>  
>>> 2) Since it seems that, for at least awhile, RSpec and Rails were a bit at 
>>> odds regarding the nature of these tests, what minor versions of RSpec 3 
>>> align with (are intended to be used with) which versions of Rails 5?
>> `rspec-rails` 4.x supports Rails 5 (and even 4.2).
>> There was a more reliable table than that in `rspec-rails` source somewhere, 
>> but just by checking README.md <http://readme.md/> of different maintenance 
>> branches of `rspec-rails` 3.x
>> `rspec-rails` 3.0-3.5 Rails 3&4
>> `rspec-rails` 3.5-3.9 Rails 3&4&5
>> 
>> 
>> For a start, there's an interesting discussion here 
>> https://github.com/rspec/rspec-rails/issues/2373 
>> <https://github.com/rspec/rspec-rails/issues/2373> and here 
>> https://github.com/rubocop-hq/rspec-style-guide/issues/113 
>> <https://github.com/rubocop-hq/rspec-style-guide/issues/113>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "rspec" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] 
> <mailto:[email protected]>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/rspec/dejalu-217-3700ca81-2903-4a43-aa70-87b831d42325%40jonrowe.co.uk
>  
> <https://groups.google.com/d/msgid/rspec/dejalu-217-3700ca81-2903-4a43-aa70-87b831d42325%40jonrowe.co.uk?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/B7A54730-D4D7-40AA-8871-2190642B25EE%40pobox.com.

Reply via email to