Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在测试中处理响应代码而不污染ApplicationController_Ruby On Rails_Ruby_Rspec_Error Handling - Fatal编程技术网

Ruby on rails 在测试中处理响应代码而不污染ApplicationController

Ruby on rails 在测试中处理响应代码而不污染ApplicationController,ruby-on-rails,ruby,rspec,error-handling,Ruby On Rails,Ruby,Rspec,Error Handling,我的问题是,我们在SolanoCI中收到了神秘的504个错误,我试图找到一种干净的方法,只在测试环境中处理它们,而不向我们的应用程序控制器添加特定于测试的代码 我已尝试通过测试设置来存根默认处理程序,如下所示: allow(ApplicationController).to receive(:timeout).and_return { #do a bunch of stuff to try to pull out request information } 但我发现它缺少一些可访问的重要

我的问题是,我们在SolanoCI中收到了神秘的504个错误,我试图找到一种干净的方法,只在测试环境中处理它们,而不向我们的应用程序控制器添加特定于测试的代码

我已尝试通过测试设置来存根默认处理程序,如下所示:

allow(ApplicationController).to receive(:timeout).and_return { 
  #do a bunch of stuff to try to pull out request information
}
但我发现它缺少一些可访问的重要信息,比如原始请求url和任何stacktrace信息


欢迎您提出任何建议。

我认为在这种情况下,最简单的方法是让Solano在他们的机器上为您运行一个测试。他们允许您使用ssh访问他们的服务器,因此您可以自己运行测试

在这样的黑盒情况下,这是一个实时节省。您可以多次运行测试,并在那里使用各种调试工具。您可能必须首先安装它们,因为Solano试图不从您的Gemfile中安装额外的工具,例如pry,以尽量减少测试的运行时间

只需通过联系方式填写,他们就会给你一个访问权限。不要忘记在完成该会话后停止该会话,因为它运行的时间将从您的计划中的工时中扣除

希望能有帮助

编辑:该功能似乎非常适合您的案例:

使用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通常表示网关超时时存在一些网络连接问题。如果这只发生在您的测试环境中,我不鼓励编写代码来解决表面上的环境网络配置问题。与管理网络的人交谈,找出在过去几天中该特定服务器是否存在任何奇怪的连接漏洞,可能会更有成效。如问题所述,它是在SolanoCI上运行的。由于所有请求都应该在CI环境中模拟或内部处理,因此我们有责任处理这些请求。通常情况下,我同意你的看法,但由于这是一个测试特定的问题,这些504是否合法值得怀疑。你不能使用类似VCR的东西来记录预期的响应吗?@ruby_newbie我们正在运行VCR。即使VCR和webmock处理所有外部请求,也会发生这种情况。这就是为什么我们需要日志记录。这是一个很好的建议,谢谢你。然而,我们实际上已经这样做了。由于504个错误不一定会出现在代码的某个部分中,因此我们仍然需要一种方法来捕获和调试它们。请澄清一下,您试图实现什么。是否要存根ApplicationController,使其抛出Timeout::Error并检查代码如何捕获该错误?或者向ApplicationController添加一些包装器并调试您真正的超时错误来自何处?我希望能够将此记录为仅测试问题,而不必污染我的ApplicationController。因为我们不能黑盒这个,而且它是断断续续的,所以我想把它放在我们的合并主控中,而不必把它包括在ApplicationController中,并在可能合法的504上运行它。@Joshburges,请看一看,我已经更新了我的答案。