为什么think_all_requests_local使用rspec配置失败

时间:2012-01-25 18:56:50

标签: ruby-on-rails-3 rspec

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中动态改变这种行为?

问候

4 个答案:

答案 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'])})

感谢: