On Fri, Feb 13, 2009 at 5:20 PM, Nathan Wilmes <nathan at pivotallabs.com>
wrote:> A few of our tests attempt to test controllers with production-style
> rescuing. Before the current rspec/Rails 2.2.2 combo, it was fairly easy
to
> set up for these tests:
>
> it "should throw a 404 for strange actions" do
> controller.use_rails_error_handling!
> get :strange_action_name
> response.should be_missing
> response.body.should include("You''ve hit our custom 404
page.")
> end
>
> As of trunk rspec/Rails 2.2.2, this doesn''t work. It turns out
that
> ActionController::TestCase has invented its own hook for testing. Without
> this hook set, you end up
> in ''local development'' mode. So to get into production
mode, you need to do
> this:
>
> it "should throw a 404 for strange actions" do
> controller.use_rails_error_handling! # rspec no longer throws the error
> without hitting Rails logic
> rescue_action_in_public! # ActionController::TestCase no longer
considers
> this request a local request
>
> get :strange_action_name
> response.should be_missing
> response.body.should include("You''ve hit our custom 404
page.")
> end
>
> Of course, if you have ''rescue_from'' handlers, these will
happen no matter
> what.
>
> I guess my question is, now that the
''rescue_action_in_public!'' hook exists
> in Rails, does it still make sense for rspec-rails to have its own method?
> Might it make sense
> to merge the two functionalities in some way?
Nathan,
Thanks for bringing this all up. I''ve made some changes and additions
based on this and a few other conversations. Here''s how it works now
(latest in git and latest github gem, and the next formal release):
1. controller.use_rails_error_handling! now works as it did in 1.1.12
2. controller.use_rails_error_handling! is now deprecated, because
rescue_action_in_public! does exactly the same thing without
rspec-rails having to monkey patch rails
3. added bypass_rescue, which you can use to bypass any rescued errors
(defined in rescue_from)
This allows you to do any of the following:
1. specify un_rescued errors with "should raise_error" (default)
2. specify un_rescued errors with status codes (using rescue_action_in_public!)
3. specify rescued errors with bypass_rescue with "should raise_error"
4. specify rescued errors with bypass_rescue with status codes (using
rescue_action_in_public!)
Both rescue_action_in_public! and bypass_rescue can be declared
per-example, or in before(:each).
Questions?
>
> =Nathan
>
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>