Как заставить пространство имен для помощника изнутри спецификации - PullRequest
0 голосов
/ 13 ноября 2010

Я пытаюсь проверить вывод помощника вида, который находится в пространстве имен.Оригинальный помощник находится в app / helpers / admin / events_helper.rb.Тест находится по адресу spec / helpers / admin / events_helper_spec.rb и выглядит следующим образом (упрощенно):

require File.dirname(__FILE__) + '/../../spec_helper'

describe Admin::EventsHelper do

  fixtures :events, :users

  before(:each) do
    @event = events(:one)
    @user = users(:one)
  end

  it "should include link to admin page for user" do
    html = helper.event_message(@event)
    html.should have_selector("a", :href => admin_user_path(@user))
  end

end

Помощник, смехотворно упрощенный, выглядит следующим образом:Метод event_message вызывается из контроллера в пространстве имен Admin, он отображает ссылку как «/ admin / users /: id», как и предполагалось.Однако, вызванный из спецификации, он отображается как '/ users /: id', что делает тест неудачным.

Как указать правильное пространство имен для использования в качестве помощника в спецификации?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

Я думаю, что проблема связана с тем, как Rspec (и инфраструктура тестирования Rails) обрабатывает контроллеры.По сложным причинам ( ОК, по причинам, которые я не понимаю ), вы не получаете настоящий ActionController при тестировании, вместо этого вы получаете экземпляр ActionView :: TestCase :: TestController.При использовании пространств имен тестовый контроллер в этом случае неправильно выводит фактический путь контроллера, поэтому он угадывает «/ users», что неверно.

Короче говоря, хотя, возможно, есть лучший способ сделать этоэто, вы можете попробовать заглушить метод контроллера, который вызывается url_for для генерации ссылки:

it "should include link to admin page for user" do
  controller.stub(:url_options).and_return(:host=>"test.host", :protocol=>"http://", :_path_segments=>{:controller=>"admin/users", :action=>"show"}, :script_name=>"")
  html = helper.event_message(@event)
  html.should have_selector("a", :href => admin_user_path(@user))
end
0 голосов
/ 14 ноября 2010

Если я правильно понял ваш вопрос, вы спрашиваете об указании пространства имен контроллера, которое не соответствует спецификации?1004 *link_to(event.message, :controller => 'admin/users', :action => 'show', :id => event.user.id) в вашем вспомогательном методе.

Обратите внимание, что значение ключа контроллера равно admin/users

...