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

时间:2011-11-25 22:44:06

标签: ruby class variables 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

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

任何想法都会很棒! 我听说你可能会使用Class.new,但我不知道该怎么做。

2 个答案:

答案 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
相关问题