是否有更好的方法来清除Rspec测试之间的类变量,而不是从after(:each)方法中明确地清除它们?我更喜欢一种“清除它们”的方式,而不是必须记住每次都将它们添加到config.after …
- 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
并在config.after(:each)中调用此方法,位于spec_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
需要“清理”的模型可以引导此行为:
- extend AutoCleanClassVariables
- CLASS_VARIABLES_TO_CLEAN = [:@@default]
这样一切正常,如果你试图将这些类的对象相互比较,那么没有(不必要的)重新加载类会导致问题(参见我之前的评论)