如何在ruby中清除rspec测试之间的类变量

我有以下类:我想确保类url仅为所有实例设置一次。

class DataFactory @@url = nil def initialize() begin if @@url.nil? Rails.logger.debug "Setting url" @@url = MY_CONFIG["my value"] end rescue Exception raise DataFactoryError, "Error!" end end end 

我有两个测试:

 it "should log a message" do APP_CONFIG = {"my value" => "test"} Rails.stub(:logger).and_return(logger_mock) logger_mock.should_receive(:debug).with "Setting url" t = DataFactory.new t = nil end it "should throw an exception" do APP_CONFIG = nil expect { DataFactory.new }.to raise_error(DataFactoryError, /Error!/) end 

问题是第二个测试从不抛出exception,因为@@ url类变量仍然是在第二个测试运行时从第一个测试设置的。 即使我在第一次测试结束时将实例设置为nil,但在第二次测试运行之前,垃圾收集还没有清除内存:

任何想法都会很棒! 我听说你可能会使用Class.new,但我不知道如何解决这个问题。

 describe DataFactory before(:each) { DataFactory.class_variable_set :@@url, nil } ... end 

这是接受的答案的替代方案,虽然不能解决您的具体例子,但我希望它可以帮助一些有同样问题的人。 如果有问题的类没有指定默认值,并且在设置之前保持未定义,则这似乎有效:

 describe DataFactory before(:each) do DataFactory.remove_class_variable :@@url if DataFactory.class_variable_defined? :@@url end ... end 

适合我的课程更像是:

 def initialize @@url ||= MY_CONFIG["my value"] ... end