5

我的 Ruby on Rails 应用程序中有许多控制器,在操作结束时有一个救援处理程序,它基本上捕获任何未处理的错误并返回某种“用户友好”错误。但是,当我进行 rake 测试时,我希望禁用那些默认的救援处理程序,以便我可以看到完整的错误和堆栈跟踪。有没有自动化的方法来做到这一点?

更新澄清:我有这样的行动:

def foo
  # do some stuff...
rescue
  render :text => "Exception: #{$!}" # this could be any kind of custom render
end

现在,当我对此进行功能测试时,如果引发异常,那么我将获得有关异常的一些信息,但我希望它表现得好像那里没有救援处理程序一样,所以我获取完整的调试信息。

更新:解决方案

我这样做了:

  rescue:
    raise unless Rails.env.production?
    render :text => "Exception: #{$!}" # this could be any kind of custom render
  end
4

5 回答 5

9

不是很自动化,但是如何修改代码以在测试中调用时重新抛出异常?

也许是这样的:

def foo
  # do some stuff...
rescue
  raise if ENV["RAILS_ENV"] == "test"
  render :text => "Exception: #{$!}" # this could be any kind of custom render
end
于 2010-01-11T02:22:30.813 回答
0

您是否查看过使用assert_raise( exception1, exception2, ... ) { block }调用然后从块中打印异常?

于 2009-05-07T18:00:27.577 回答
0

您使用哪种方法?ActionController 中有两种救援方法。

我的基本控制器中有这个:

def rescue_action_in_public(exception)
    response_code = response_code_for_rescue(exception)
    status = interpret_status(response_code)
    respond_to do |format|
        format.html { render_optional_error_file response_code}
        format.js { render :update, :status => status  do |page| page.redirect_to(:url => error_page_url(status)) end}
end

结尾

这仅在生产模式下显示自定义错误。

于 2009-05-07T18:59:33.770 回答
0

我认为最简单的做法是验证是否调用了正确的渲染 - 或者与常规、非异常情况不同的任何内容。

于 2009-08-21T06:49:25.177 回答
-1

您不需要禁用救援块。使用 assert_raise 方法(如 Scott 所建议的那样),并在块中调用您期望异常的方法。

例如:

def test_throws_exception
  assert_raise Exception do
    raise_if_true(true)
  end
end
于 2009-05-13T06:05:08.210 回答