проблема с вспомогательным методом в рельсах - PullRequest
2 голосов
/ 23 августа 2011

У меня есть следующий вспомогательный метод (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

и вот это эрб (app / views / layouts / application.html.erb):

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

Я запустил тест rspec, чтобы проверить, работает ли этот вспомогательный метод, и кажется, что он не может найти заголовок.

Вот сообщение об ошибке:

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)>'

Может кто-нибудь сказать мне, что я сделал не так?

UPDATE

Я включил помощника, выполнив следующее:

 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

Однако я все еще получаю ту же ошибку

1 Ответ

2 голосов
/ 23 августа 2011

По вашему мнению, помощники не включены по умолчанию.

Вы можете макетировать вспомогательные методы, используя объект шаблона :

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

Вы можетезатем протестируйте помощников отдельно.

В качестве альтернативы вы можете включить своих помощников в спецификацию представления, просто выполнив:

include ApplicationHelper

РЕДАКТИРОВАТЬ

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
...