2013-02-16 1 views
1

Следуя инструкциям Майкла Хартла Rails, я экспериментировал с некоторыми пользовательскими функциями в своем тестовом разделе и сталкивался с тем, что меня удивило. В основном глобальные переменные пути (например, «root_path») работают только в блоке «do ... end» раздела «it» в блоке «описать» тестов RSpec.Rails: RSpec: использование глобальных переменных пути, похоже, работает только внутри блоков «it»

Я считаю, что следующие детали сводятся к вопросу, что особенного в блоке «it», который позволил «root_path» работать там, пока он не работает за пределами блока «it»?

(я определил обходной путь, но мне интересно, есть ли твердое объяснение такого поведения.)

Файл: спецификации/запросы/static_pages_spec.rb

Это не удается:

require 'spec_helper' 

def check_stable(path) 
    it "should be stable" do 
    get path 
    response.status.should be(200) 
    end 
end 

describe "StaticPages" do 
    describe "Home => GET" do 
    check_stable(root_path) 
    end 
end 

Это преуспевает:

require 'spec_helper' 

describe "StaticPages" do 
    describe "Home => GET" do 
    it "should be stable" do 
     get root_path 
     response.status.should be(200) 
    end 
    end 
end 

Неудача в основном:

$ bundle exec rspec spec/requests/static_pages_spec.rb 
Exception encountered: #<NameError: undefined local variable or method `root_path' for #<Class:0x00000004cecd78>> 

... любая идея, почему?

Я попробовал все предложения по этим два резьбу:

Hartl's Tutorial Section 5.3.2: Rails Routes

Rspec and named routes

Никто не работал, пока я не разузнал вопрос выше.

ответ

2

Да, названные маршруты работают только в пределах it или specify блоков. Но это легко изменить код:

def should_be_stable(path) 
    get path 
    response.status.should be(200) 
end 

describe "StaticPages" do 
    describe "Home => GET" do 
    it { should_be_stable(root_path) } 
    end 
end 

Вы стали нужно to include url_helpers

+0

... или внутри 'before: each do' или' after each do'. –

+0

Справедливая точка: легкость модификации - и я ценю, что вы демонстрируете настройку, сохраняя при этом однолинейный тест из «описания». Сохраняет подфункции также более тонкие, если на то пошло. – DreadPirateShawn

1

it блоков (или specify блоков) являются то, что обозначают реальные тесты. Внутри теста вы получите доступ к полному набору помощников Rails и Rspec; вне теста, не так много (как вы это разработали).