Представление корректно отображается в браузере, но тесты не выполняются вспомогательным методом? - PullRequest
4 голосов
/ 08 июля 2011

У меня есть простое представление и помощник, который определяет заголовок.Все работает нормально, если я поднимаю представление в браузере, но тесты rspec не проходят.Вот что у меня есть:

Вот мои тесты:

describe PagesController do
  render_views

  before(:each) do
    @base_title = "RoR Sample App"
  end

  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 => @base_title + " | Home")
    end
  end
end

Контроллер страниц:

class PagesController < ApplicationController
  def home
    @title = "Home"
  end

  def contact
    @title = "Contact"
  end

  def about
    @title = "About"
  end

  def help
    @title = "Help"
  end
end

Помощник:

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

И представление:

<!DOCTYPE html>
<html>
<head>
  <title><%= title %></title>
  <%= stylesheet_link_tag :all %>
  <%= javascript_include_tag :defaults %>
  <%= csrf_meta_tag %>
</head>
<body>

<%= yield %>

</body>
</html>

Все это правильно отображается в браузере, но тесты не проходят, когда он достигает строки <%= title %>.

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

Любая идея, что я делаюнеправильно?

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Это известная проблема со spork.Вы можете использовать этот обходной путь в своем блоке prefork:

Spork.trap_method(Rails::Application, :reload_routes!)
Spork.trap_method(Rails::Application::RoutesReloader, :reload!)
1 голос
/ 08 июля 2011

Это ваш application.html.erb. Он не может увидеть этот метод в PagesHelper, вам нужно поместить этот метод в ApplicationHelper. PagesHelper могут видеть только просмотры, сделанные вашим PagesController. И это хорошая идея, чтобы явно добавить return в ваших помощников.

0 голосов
/ 11 июля 2011

В итоге проблема в том, что я использовал камень Spork для ускорения тестирования и по любой причине spork не регистрировал, что ApplicationHelper изменился.

Решениебыло просто перезагрузить гем spork и снова запустить тесты.

...