Ruby on rails 在rspec测试之间重置类变量的干净解决方案
有没有比从after(:each)方法中明确地清除类变量更好的方法来清除Rspec测试之间的类变量?我更喜欢“全部清除”的方式,而不是每次都要记得将它们添加到config.afterRuby 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
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