如何测试rescue_from的路由故障?

时间:2010-11-04 17:12:44

标签: ruby-on-rails

在我们的rails 2.3应用程序中,我已按如下方式设置了rescue_from路由错误:

rescue_from ActionController::RoutingError,       :with => :redirect_or_render_error
rescue_from ActionController::UnknownController,  :with => :redirect_or_render_error
rescue_from ActionController::UnknownAction,      :with => :redirect_or_render_error

然后在我的redirect_or_render_error方法中,我重定向某些URL(从数据库中提取,所以我不能只使用routes.rb),我想测试一下。我是在我的索引页面的功能测试中做的(这是正确的地方吗?)如下:

@request.remote_addr = '12.34.56.78' # fake remote request
get '/example'
assert_redirected_to '/example_things/123456'

我得到了

ActionController::RoutingError: No route matches {:action=>"/example", :controller=>"home"}

即使它在开发中有效。如何测试rescue_from的路由故障?

2 个答案:

答案 0 :(得分:0)

你断言你的路线是正确的。事实并非如此。您有一组计划不映射的路由,并且您将在异常处理程序中处理该路由。 (旁白:我认为你应该尝试在routes.rb中处理尽可能多的情况,并让普通的Ruby方法处理任何进一步的操作。)

无论如何,为了真正测试这个,你想要做的更多:

@request.remote_addr = '12.34.56.78' # fake remote request
assert_raise ActionController::RoutingError do
  get '/example'
end

答案 1 :(得分:0)

原则上我必须使用集成测试而不是功能测试,如下所示:

get '/example', {}, :remote_addr => '12.34.56.78'
assert_redirected_to '/example_things/123456'

我还需要在config / environments / test.rb

中将config.action_controller.consider_all_requests_local设置为false