Как очистить переменные класса между тестами rspec в ruby? - PullRequest
21 голосов
/ 26 ноября 2011

У меня есть следующий класс: Я хочу убедиться, что 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 ]

22 голосов
/ 26 ноября 2011
describe DataFactory
  before(:each) { DataFactory.class_variable_set :@@url, nil }
  ...
end
5 голосов
/ 13 марта 2014

Вот альтернатива принятому ответу, который хотя и не решит ваш конкретный пример, но я надеюсь, что он может помочь нескольким людям с вопросом в том же духе. Если рассматриваемый класс не задает значение по умолчанию и остается неопределенным до тех пор, пока не будет установлен, это похоже на работу:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...