有没有比在after(:each)方法中显式清除它们更好的方法来在Rspec测试之间清除类变量?我宁愿使用一种“清除所有内容”的方式,而不必每次都记得之后将它们添加到config。中。

config.after(:each) do
  DatabaseCleaner.clean

  Currency.class_variable_set :@@default, nil
end

最佳答案

我最终通过在lib/auto_clean_class_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

需要“清理”的模型可以引导此行为:
extend AutoCleanClassVariables
CLASS_VARIABLES_TO_CLEAN = [:@@default]

这样,一切工作正常,并且如果尝试将这些类的对象彼此进行比较,则不会(不必要)重载该类而导致问题(请参阅我先前的评论)

关于ruby-on-rails - 干净的解决方案,用于在两次rspec测试之间重置类变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19075907/

10-09 20:41