我有以下课程: 我想确保只为所有实例设置一次类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
问题是第二个测试从不抛出异常,因为@@ url类变量仍然是在第二个测试运行时从第一个测试设置的。 即使我在第一次测试结束时将实例设置为nil,垃圾收集在第二次测试运行之前还没有清除内存:
任何想法都会很棒! 我听说你可能会使用Class.new,但我不知道该怎么做。
答案 0 :(得分:22)
describe DataFactory
before(:each) { DataFactory.class_variable_set :@@url, nil }
...
end
答案 1 :(得分:5)
以下是已接受答案的替代方案,虽然不能解决您的具体例子,但我希望它可以帮助一些有同样问题的人。如果有问题的类没有指定默认值,并且在设置之前保持未定义,则这似乎有效:
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