【问题标题】:How do I disable rescue handlers in Ruby on Rails apps when I'm running functional tests?运行功能测试时,如何在 Ruby on Rails 应用程序中禁用救援处理程序?
【发布时间】:2009-05-07 05:56:27
【问题描述】:

我的 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

【问题讨论】:

    标签: ruby-on-rails unit-testing exception rescue


    【解决方案1】:

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

    大概是这样的:

    def foo
      # do some stuff...
    rescue
      raise if ENV["RAILS_ENV"] == "test"
      render :text => "Exception: #{$!}" # this could be any kind of custom render
    end
    

    【讨论】:

    • 如果 Rails.env.test 提高?更清洁 IMO
    • @Steven 这并不仅仅在生产中真正拯救。它提高了它所在的位置.. 但是如果你在#do 的东西中有 20 行代码,那么 raise 就不会提到这个。跟踪表明错误发生在 raise 所在的行上。
    • 其实没有。 raise with no arguments 重新引发我们刚刚捕获的异常,保持堆栈跟踪不变。换句话说,它会正确指出最初引发异常的位置,而不是 raise if Rails.env.test?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您使用哪种方法? 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
      

      结束

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

      【讨论】:

      • 为什么只在生产模式下运行?我没看到。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        例如:

        def test_throws_exception
          assert_raise Exception do
            raise_if_true(true)
          end
        end
        

        【讨论】:

        • 我不是要断言异常,我知道如何做到这一点并且已经做过很多次了。我正在尝试获取有关在我不期望它们(包括堆栈跟踪)时发生但仅在我处于测试模式时发生的异常的完整信息。
        • 啊。对不起。我误解了你想要达到的目标。
        猜你喜欢
        • 2019-03-28
        • 2023-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2018-12-27
        • 2011-12-08
        相关资源
        最近更新 更多