В RSpec, как можно передать переменную экземпляра в блок примера? - PullRequest
1 голос
/ 09 мая 2011

Я использую некоторые методы spec_helper.rb для генерации примеров RSpec, и один из них зависит от данных другого.

Пример spec_helper.rb:

def it_should_be_big(objects)
  @tested_objects ||= []

  objects.each do |obj|
    it "should be big (#{obj.name})" do
      obj.should be_big
    end
  end

  @tested_objects += objects
end

def it_should_be_small(objects)
  @tested_objects ||= []

  objects.each do |obj|
    it "should be small (#{obj.name})" do
      obj.should be_small
    end
  end

  @tested_objects += objects
end

def it_should_have_tested_for_all_objects
  it "should test for all objects" do
    @tested_objects ||= []

    (all_objects - @tested_objects).should == []

    @tested_objects = []
  end
end

Пример something_spec.rb:

describe "something" do
  it_should_be_big(some_objects)
  it_should_be_small(some_other_objects)

  it_should_have_tested_for_all_objects
end

Я знаю, что код не имеет особого смысла, но он соответствует фактическому коду, где он имеет значение (переменная @tested_objects).

Когда я запускаю спецификации, онне могу найти переменную @tested_objects (я предполагаю, что она использует другое пространство переменных внутри блоков примера). Есть ли способ передать переменную внутрь блока примера конечного вспомогательного метода?

RSpec 2.5, Rails 3.0.4, Ruby 1.8.7

1 Ответ

1 голос
/ 09 мая 2011

В зависимости от ситуации вы можете захотеть before или share_examples_for.


обходной путь: кажется, что it видит только локальные переменные. Тогда вы можете попробовать это:

def it_should_have_tested_for_all_objects
  @tested_objects ||= []

  tested_objects = @tested_objects
  it "should test for all objects" do
    (all_objects - tested_objects).should == []
  end

  @tested_objects = []
end

...