rspec-rails tricks: Hacking Your Routes for a SpecPosted: January 23, 2018 | Author: ThomasPowell | Filed under: ruby | Tags: rails, routing, rspec | Leave a comment »
I don’t know that this is so much a reminder of “What can be done with rspec-rails” as a note that, “If you do this will rspec-rails, you will also need to undo it.”
Today’s note: If you hack the application routes for a controller test, you have to reload routes.
The original problem
This all came down to a spec that was attempting to test a method in
ApplicationController. In our Rails 3 setup (rspec-core and rspec-rails 3.7.0), the tests only needed a monkey patched
ApplicationController to happen prior to the test:
before do class ApplicationController def dummy_action dummy_method_actually_under_test end end end it 'example do test' do get :dummy_action #etc... # validate dummy_method_actually_under_test did the thing end
In Rails 4 with the same gem versions, we’d end up with the “No route matches…” which could be remedied by redefining the routes.
before do class ApplicationController def dummy_action dummy_method_actually_under_test end end Rails.application.routes.draw do get 'application/dummy_action/:id', to: 'application#dummy_action' end end
Great! The test passes now! (Insert philosophical argument about whether the person writing the test should have tested a method in this way.)
..until you run the rest of the suite, of course. Now *every* subsequent controller test has a “No route matches” issue. (Insert philosophical argument about whether you should be writing controller tests.)
This should serve as a periodic reminder to clean up after your tests, which in this case is:
after do Rails.application.reload_routes! end