Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.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 在rspec测试之间重置类变量的干净解决方案_Ruby On Rails_Rspec_Rspec Rails - Fatal编程技术网

Ruby on rails 在rspec测试之间重置类变量的干净解决方案

Ruby on rails 在rspec测试之间重置类变量的干净解决方案,ruby-on-rails,rspec,rspec-rails,Ruby On Rails,Rspec,Rspec Rails,有没有比从after(:each)方法中明确地清除类变量更好的方法来清除Rspec测试之间的类变量?我更喜欢“全部清除”的方式,而不是每次都要记得将它们添加到config.after config.after(:each) do DatabaseCleaner.clean Currency.class_variable_set :@@default, nil end 您应该能够在每次运行后重新加载该类: after(:each) do Object.send(:remove_co

有没有比从after(:each)方法中明确地清除类变量更好的方法来清除Rspec测试之间的类变量?我更喜欢“全部清除”的方式,而不是每次都要记得将它们添加到config.after

config.after(:each) do
  DatabaseCleaner.clean

  Currency.class_variable_set :@@default, nil
end

您应该能够在每次运行后重新加载该类:

after(:each) do
  Object.send(:remove_const, 'Currency')
  load 'currency.rb'
end

请参阅:

我最终通过在lib/auto\u clean\u class\u variables.rb中定义一个方法来重置给定类的所有类变量来实现这一点

module AutoCleanClassVariables
  def reset_class_variables
    self::CLASS_VARIABLES_TO_CLEAN.each do |var|
      class_variable_set var, nil
    end
  end
end
并从位于spec_helper.rb中的config.after(:each)中调用此方法

config.append_after(:each) do
  DatabaseCleaner.clean

  # Find all ActiveRecord classes having :reset_class_variables defined
  classes = ActiveSupport::DescendantsTracker.descendants(ActiveRecord::Base)
  classes.each do |cl|
    if cl.methods.include?(:reset_class_variables)
      cl.reset_class_variables
    end
  end
end
Spec::Runner.configure do |config|
  config.before(:all) {}
  config.before(:each) {
       Class.class_variable_set :@@variable, value
  }
  config.after(:all) {}
  config.after(:each) {}
end
需要“清洗”的型号可以引导这种行为:

extend AutoCleanClassVariables
CLASS_VARIABLES_TO_CLEAN = [:@@default]

通过这种方式,一切工作正常,如果您尝试将这些类的对象彼此进行比较(请参阅我前面的评论),则不会(不必要)重新加载该类而导致问题。

请将此包含在spec\u helper.rb中

config.append_after(:each) do
  DatabaseCleaner.clean

  # Find all ActiveRecord classes having :reset_class_variables defined
  classes = ActiveSupport::DescendantsTracker.descendants(ActiveRecord::Base)
  classes.each do |cl|
    if cl.methods.include?(:reset_class_variables)
      cl.reset_class_variables
    end
  end
end
Spec::Runner.configure do |config|
  config.before(:all) {}
  config.before(:each) {
       Class.class_variable_set :@@variable, value
  }
  config.after(:all) {}
  config.after(:each) {}
end

这将在每次不同的测试之前运行您选择的内容。接受的解决方案没有解决至少两个我需要重置类变量的情况。

这似乎打破了def def default之类的测试?self==Currency.default end,因为无法再比较Currency类的“旧”和“新”实例。。。我最终完成了一个“delete_class_vars”方法,比如def delete_class_vars(classname)cl=classname.camelize.constantize cl.class_variables.each do|class_var | cl.class_variable_set class_var,nil end end