Question

I have the following helper method (app/helpers/application_helper.rb):

module ApplicationHelper

 #Return a title on a per-page basis
 def title
   base_title = "Ruby on Rails Tutorial Sample App"
   if @title.nil?
     base_title
   else
     "#{base_title} | #{@title}"
   end
 end
end

and here's the erb ( app/views/layouts/application.html.erb):

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <%= csrf_meta_tag %>
  </head>
  <body>
    <%= yield %>
  </body>
</html>

I ran an rspec test to see if this helper method works and it seems that it can't find title.

Here's the error message:

Failures:

  1) PagesController GET 'home' should be successful
     Failure/Error: get 'home'
     ActionView::Template::Error:
       undefined local variable or method `title' for #<#<Class:0x991ecb4>:0x991315c>
     # ./app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb__248109341_80250010__979063050'
     # ./spec/controllers/pages_controller_spec.rb:8:in `block (3 levels) in <top (required)>'

  2) PagesController GET 'home' should have the right title
     Failure/Error: get 'home'
     ActionView::Template::Error:
       undefined local variable or method `title' for #<#<Class:0x991ecb4>:0x9d7d094>
     # ./app/views/layouts/application.html.erb:4:in `_app_views_layouts_application_html_erb__248109341_82566280__979063050'
     # ./spec/controllers/pages_controller_spec.rb:13:in `block (3 levels) in <top (required)>'

Can anyone tell me what I did wrong?

UPDATE:

I included the helper by doing the following:

 describe PagesController do
      include ApplicationHelper
      render_views

      describe "GET 'home'" do
        it "should be successful" do
          get 'home'
          response.should be_success
        end

       it "should have the right title" do
      get 'home'
      response.should have_selector("title",
                        :content => "Ruby on Rails Tutorial Sample App | Home")
    end
  end


//and some more

However I am still getting the same error

Était-ce utile?

La solution

In your views, the helpers are not included by default.

You can mock out the helper methods using the template object:

template.should_receive(:title).and_return("Title")

You can then test your helpers separately.

Alternatively you can include your helpers in your view spec by simply doing:

include ApplicationHelper

EDIT

describe PagesController do
  include ApplicationHelper

  describe "GET 'home'" do
    it "should be successful" do
      controller.template.should_receive(:title).and_return("Title")
      get 'home'
      response.should be_success
    end
  end
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top