如何在规范内强制为帮助程序命名空间

时间:2010-11-13 16:54:40

标签: ruby-on-rails namespaces rspec

我正在尝试测试位于命名空间内的视图助手的输出。原始助手位于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

帮助者,被荒谬简化,看起来像这样:

module Admin::EventsHelper
  def event_message(event)
    link_to(
      event.message, 
      :controller => 'users', :action => 'show', :id => event.user.id)
  end
end

当从Admin命名空间内的控制器调用event_message方法时,它会按预期将链接呈现为“/ admin / users /:id”。但是,从规范调用,它呈现为'/ users /:id',使测试失败。

如何在规范中为helper指定正确的命名空间?

谢谢!

2 个答案:

答案 0 :(得分:2)

我认为问题源于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

答案 1 :(得分:0)

如果我的问题是正确的,那么您是在询问指定控制器命名空间是否符合规范?

如果UsersController在Admin命名空间内,那么你应该这样做:

帮助方法中的

link_to(event.message, :controller => 'admin/users', :action => 'show', :id => event.user.id)

请注意,控制器键的值为 admin/users