2013-03-23 2 views
3

У меня есть несколько наборов rspec, которые включают в себя некоторые общие примеры. Я хотел бы, чтобы эти общие примеры включали другие общие примеры, если исходная спецификация имела некоторый набор переменных. В основном это то, что я пытаюсь сделать.Включить примеры Rspec с переменной

Пример:

файла: spec/test_spec.rb

describe 'some thing' do 
    let(:some_feature) { true } 

    describe 'some tests' do 
    include_examples "shared_tests" 
    end 
end 

Файл spec/shared/shared_tests.rb

shared_examples_for "shared_tests" do 
    include_examples "feature_specific_tests" if some_feature 
end 

Как и следовало ожидать, это бросает ошибку, как это:

undefined local variable or method `some_feature` 

Есть ли способ сделать это? Я думал, возможно, я мог бы определить @some_feature в блоке before(:all), а затем использовать if @some_feature в shared_examples, но это всегда nil.

ответ

3

Переписывая ответ, чтобы сделать его немного понятнее:

Вы должны были это:

Файл: спецификации/test_spec.rb

describe 'some thing' do 
    let(:some_feature) { true } 

    describe 'some tests' do 
    include_examples "shared_tests" 
    end 
end 

Файл спецификации/общий/shared_tests.rb

shared_examples_for "shared_tests" do 
    include_examples "feature_specific_tests" if some_feature 
end 

Изменить его:

Файл: спецификации спецификации/test_spec.rb

describe 'some thing' do 

    describe 'some tests' do 
    include_examples "shared_tests" do 
     let(:some_feature) { true } 
    end 
    end 
end 

Файл/общий/shared_tests.rb

shared_examples "shared_tests" do 
    if some_feature 
    it_should_behave_like "feature_specific_tests" 
    end 

    # rest of your tests for shared example group 
    # 'a logged in registered user goes here 
end 

и это все работает хорошо :-)

+0

Хорошо, это имеет смысл. Вопрос скорее похож на то, как использовать только «it_should_behave_like» некоторые тесты «если some_feature», так как переменная находится за пределами ее области – Eugene

+0

справа - см. Нижний блок кода - просто сдвиньте строку let (: some_feature) вниз от того места, где у вас было это в блок, в котором вы пишете свои первые общие примеры, звоните ... сравните блок, который я положил внизу, в исходный блок вверх. Вы просто эффективно передаете правдивое значение через общий набор примеров в блоке, который затем будет доступен во второй группе ... –

+0

Вот документация: https://www.relishapp.com/rspec/rspec -core/v/2-11/docs/example-groups/shared-examples –

Смежные вопросы