I'm on the chapter 5 exercises for Michael Hartl's Rails Tutorial and am trying to wrap my head around how Rails/Rspec is testing a helper method full_title
in app/helpers/application_helper.rb
. All of my tests are in spec/requests/static_pages_spec.rb
and within them, I'm calling full_title
to cut down on code bloat.
So, in order to test the original full_title
I create a test in spec/helpers/application_helpers_spec.rb
and include it via spec/support/utilities.rb
. The code is passing, but I want to understand the process (order to operations) to what is going on. Thank you.
Can I think of it like this?
- Rspec begins to run
static_pages_spec.rb
(includingutilities.rb
) - Rspec sees the full_title method in
static_pages_spec.rb
- Rspec begins to run
application_helper_spec.rb
- Rspec sees
describe "full_title" do
inapplication_helper_spec.rb
- Rspec looks up original
full_title
method and finishes test forapplication_helper_spec.rb
- Rspec finishes tests in static_pages_spec.rb
, iterating through above process when
full_title` is called.
static_pages_spec.rb
require 'spec_helper'
describe "Static pages" do
subject { page }
shared_examples_for "all static pages" do
it { should have_selector('h1', text: heading) }
it { should have_selector('title', text: full_title(page_title)) }
end
describe "Home page" do
before { visit root_path }
let(:heading) { 'Sample App' }
let(:page_title) { '' }
it_should_behave_like "all static pages"
it { should_not have_selector 'title', text: '| Home' }
end
describe "Help page" do
before { visit help_path }
let(:heading) { 'Help' }
let(:page_title) { 'Help' }
it_should_behave_like "all static pages"
end
describe "About page" do
before { visit about_path }
let(:heading) { 'About' }
let(:page_title) { 'About Us' }
it_should_behave_like "all static pages"
end
describe "Contact page" do
before { visit contact_path }
let(:heading) { 'Contact' }
let(:page_title) { 'Contact' }
it_should_behave_like "all static pages"
end
it "should have the right links on the layout" do
visit root_path
click_link "About"
page.should have_selector 'title', text: full_title('About Us')
click_link "Help"
page.should have_selector 'title', text: full_title('Help')
click_link "Contact"
page.should have_selector 'title', text: full_title('Contact')
click_link "Home"
page.should have_selector 'title', text: full_title('')
click_link "Sign up now!"
page.should have_selector 'title', text: full_title('Sign up')
click_link "sample app"
page.should_not have_selector 'title', text: full_title('| Home')
end
end
application_helper_spec.rb
require 'spec_helper'
describe ApplicationHelper do
describe "full_title" do
it "should include the page title" do
full_title("foo").should =~ /foo/
end
it "should include the base title" do
full_title("foo").should =~ /^Ruby on Rails Tutorial Sample App/
end
it "should not include a bar for the home page" do
full_title("").should_not =~ /\|/
end
end
end
application_helper.rb
module ApplicationHelper
#Returns the full title on a per-page basis.
def full_title(page_title)
base_title = "Ruby on Rails Tutorial Sample App"
if page_title.empty?
base_title
else
"#{base_title} | #{page_title}"
end
end
end
Think about it this way:
The 'full_title' called in
static_pages_spec.rb
(including utilities.rb) is running the 'full_title' method described in application_helper.rb.The
application_helper_spec.rb
is validating the string/value (page_title) passed through full_title. If I'm not mistaken, it does this each time thefull_title
method is called in your tests.