【问题标题】:Handle a response code in test without polluting ApplicationController在不污染 ApplicationController 的情况下处理测试中的响应代码
【发布时间】:2015-12-10 16:38:48
【问题描述】:

我的问题是我们在 SolanoCI 中收到了神秘的 504 错误,我试图找到一种干净的方法来仅在测试环境中处理它们,而不向我们的 ApplicationController 添加特定于测试的代码。

我尝试过像这样通过测试设置存根默认处理程序:

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

但我发现它缺少一些可访问的重要信息,例如原始请求 url 和任何堆栈跟踪信息。

欢迎提出任何建议。

【问题讨论】:

  • 504 通常表示存在一些网络连接问题(网关超时)。如果这只发生在您的测试环境中,我不鼓励编写代码来解决表面上是环境网络配置问题。与管理网络的人交谈并确定在过去几天中该特定服务器是否存在任何奇怪的连接中断可能会更有效率。
  • 如问题所述,它在 SolanoCI 上运行。由于所有请求都应该在 CI 环境中进行模拟或内部处理,因此我们有责任处理它们。通常情况下,我会同意你的看法,但由于这是一个特定于测试的问题,因此怀疑这些是否是合法的 504。
  • 你不能使用像 VCR 这样的东西来记录预期的响应吗?
  • @ruby_newbie 我们正在运行 VCR。即使使用 VCR 和 webmock 处理所有外部请求,这些也会发生。这就是我们需要记录的原因。

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


【解决方案1】:

我认为在这种情况下对您来说最简单的方法是让 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

【讨论】:

  • 这是一个很好的建议,非常感谢。然而,我们实际上已经这样做了。由于 504 错误不一定会出现在代码的某个部分中,因此我们仍然需要一种方法来在那里捕获和调试它们。
  • 请澄清一下,您要完成什么。你想存根 ApplicationController 让它抛出 Timeout::Error 并检查你的代码是如何捕获它的吗?或者向 ApplicationController 添加一些包装器并调试您真正的超时错误来自哪里?
  • 我希望能够记录这个仅用于测试的问题,而不必污染我的 ApplicationController。由于我们不能对此进行黑箱处理并且它是间歇性的,因此我想将其放入我们合并的 master 中,而不必将其包含在 ApplicationController 中并在可能合法的 504 上运行它。
  • @JoshBurgess 请看一下,我已经更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多