rspec-rails(2.7.0)rails(3.0.10) 帖子:Rails 3.1 Error Catching与我无关。
代码:
class ApplicationController < ActionController::Base
unless Rails.application.config.consider_all_requests_local
rescue_from ActiveRecord::RecordNotFound, :with => :render_404
rescue_from Exception, :with => :render_500
rescue_from FunnyException, :with => :my_errors
def my_errors(exception)
#some stuff for production
puts "=======From top====#{Rails.application.config.consider_all_requests_local}"
end
else
rescue_from FunnyException, :with => :my_errors
def my_errors(exception)
#some stuff for development
puts "=====From bottom======#{Rails.application.config.consider_all_requests_local}"
end
end
end
此代码完美适用于生产/开发......问题是当我想用rspec测试它时。如何在环境之间切换测试用例?
我尝试添加类似的内容:
before do
Rails.application.config.consider_all_requests_local = true
end
我明白了:
... =====从底部开始====== true。=====从底部开始====== true。=====来自 bottom ====== true。=====从底部开始====== true
如此尝试
before do
Rails.application.config.consider_all_requests_local = false
end
所以我得到了:
... =====从底部开始====== false。=====从底部开始====== false。=====来自 bottom ====== false。=====从底部开始====== false
怎么可能呢? ......与更改spec_helper相同
config.before(:each) do
Rails.application.config.consider_all_requests_local = false
end
除非不起作用。使用rspec无法访问热门部分...总是点击底部为什么?我认为它现在以某种方式与Rack绑定......但有没有任何解决方案可以在rspec中动态改变这种行为?
问候
答案 0 :(得分:22)
好的,我发现很容易解决方案
before do
Rails.application.config.consider_all_requests_local = false
load "application_controller.rb"
end
after do
Rails.application.config.consider_all_requests_local = true
load "application_controller.rb"
end
它是匿名应用程序控制器测试套件的一部分。
您必须在阻止后添加...因为此更改将在其他套件中保留。
欢迎任何改进:D
编辑:使用spork和guard对我来说有时会出现随机错误...之前:所有人似乎都解决了这个问题
答案 1 :(得分:0)
逻辑块在类级别定义,在类加载期间进行评估。这就是为什么它不会去其他地方&#39;即使您在运行时手动将其设置为false。
我也很想知道测试这个的最佳方法是什么。我唯一的线索是以某种方式重新加载或重新评估ActionController,类似于重载! rails控制台中的方法。
答案 2 :(得分:0)
我发现使用cucumber-rails正确的做法是添加@ allow-rescue标签。
答案 3 :(得分:0)
您还需要设置 before do
method = Rails.application.method(:env_config)
expect(Rails.application).to receive(:env_config).with(no_args) do
method.call.merge(
"action_dispatch.show_exceptions" => true,
"action_dispatch.show_detailed_exceptions" => false,
"consider_all_requests_local" => false
)
end
end
。但是由于Rails缓存了这个值,这只有在你自己运行规范时才有效。幸运的是,您可以通过模拟配置来更改当前规范的这些选项:
import pandas as pd
# Column contains column name
df1 = pd.DataFrame({"Column": pd.Series(['a', 'b', 'b', 'c']),
"Item": pd.Series(['x', 'y', 'z', 'x']),
"Result": pd.Series([3, 4, 5, 6])})
df2 = pd.DataFrame({"a": pd.Series(['x', 'n', 'n']),
"b": pd.Series(['x', 'y', 'n']),
"c": pd.Series(['x', 'z', 'n'])})
感谢: