Я изучаю книгу «Учебник по Ruby on Rails 3» и натолкнулся на ту часть, где мне нужно написать несколько базовых модульных тестов для моих статических страниц. Я заметил, что код реплицирован только с некоторыми изменениями текста, поэтому я изменил его следующим образом:
require 'spec_helper'
describe PagesController do
render_views
pages = ['home', 'contact', 'about', 'help']
before(:each) do
@base_title = "Ruby on Rails Tutorial Sample App | "
end
pages.each do |page|
describe "GET '#{page}'" do
it "should be successful" do
get "#{page}"
response.should be_success
end
it "should have the right title" do
get "#{page}"
response.should have_selector("title", :content => @base_title + page.capitalize)
end
end
end
end
Что меня смущает в приведенном выше примере, так это то, что я могу заменить переменную 'pages' следующим:
@pages = ['home', 'contact', 'about', 'help']
И это все еще работает. Это почему? Чем отличаются «@pages» и «pages»?
Другая сбивающая с толку вещь заключается в том, что оба этих параметра приводят к сбою тестов:
pages = ['home', 'contact', 'about', 'help']
@base_title = "Ruby on Rails Tutorial Sample App | "
И
before(:each) do
pages = ['home', 'contact', 'about', 'help']
@base_title = "Ruby on Rails Tutorial Sample App | "
end
Почему вышеприведенные 2 примера терпят неудачу? Почему код должен выглядеть так, как я написал в своем первом фрагменте кода? Я предполагаю, что это как-то связано с переменной областью действия, но я все еще новичок в Ruby, поэтому я ищу более глубокое понимание.
FWIW, я опытный разработчик C #, поэтому получение сопоставимого кода Java или C # поможет мне понять это или хорошо написанное описание.
Спасибо за любую поддержку.
Edit:
Добавлено сообщение об ошибке, когда я перемещаю @base_title за пределы блока before.
Failure/Error: response.should have_selector("title", :content => @base_title + page.capitalize)
NoMethodError:
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.+
# ./spec/controllers/pages_controller_spec.rb:21:in `block (4 levels) in <top (required)>'