我正在尝试测试位于命名空间内的视图助手的输出。原始助手位于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指定正确的命名空间?
谢谢!
答案 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