Ruby on rails 在测试中处理响应代码而不污染ApplicationController
我的问题是,我们在SolanoCI中收到了神秘的504个错误,我试图找到一种干净的方法,只在测试环境中处理它们,而不向我们的应用程序控制器添加特定于测试的代码 我已尝试通过测试设置来存根默认处理程序,如下所示: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 } 但我发现它缺少一些可访问的重要
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,请看一看,我已经更新了我的答案。