Handle a response code in test without polluting ApplicationController

时间:2015-09-14 15:47:08

标签: ruby-on-rails ruby rspec error-handling

My problem is that we're receiving mysterious 504 errors in SolanoCI, and I'm trying to find a clean way to handle them only in the test environment without adding test-specific code to our ApplicationController.

I've tried stubbing a default handler via the test setup like so:

allow(ApplicationController).to receive(:timeout).and_return { 
  #do a bunch of stuff to try to pull out request information
}

but I'm finding that it's lacking some important information that's accessible, like the original request url and any stacktrace information.

Any suggestions are welcome.

1 个答案:

答案 0 :(得分:0)

我认为在这种情况下,最简单的方法是让Solano为你在他们的盒子上运行debugging session(他们给你ssh访问他们的服务器,所以你可以自己运行测试)。

在这样的黑匣子情况下,这是一个实时的节省时间。您可以多次运行测试并在那里使用各种调试工具。您可能必须先安装它们,因为Solano尝试不从您的Gemfile中安装额外的工具(例如pry)以最大限度地缩短测试的运行时间。

只需通过联系表单填写,他们就会为您提供访问权限。在你完成它之后不要忘记停止该会话,因为它的运行时间是从你计划中的工作时间中扣除的。

希望它有所帮助。

编辑:似乎Anonymous controller功能非常适合您的情况:

  

使用controller方法定义一个匿名控制器   继承自描述的类。这对于指定很有用   全局错误处理等行为。

所以,你可以这样做:

RSpec.describe ApplicationController, :type => :controller do
  controller(ApplicationController) do

    rescue_from Timeout::Error, :with => :log_timeout

    def log_timeout(error)
      # log error as you wish
    end
  end

  describe "handling timeout exceptions" do
    it "writes some logs" do
      get :index
      expect(response).to have_https_status(504)
    end
  end
end