我有一个名为Xpmodule
的Rails模型,其中包含相应的控制器XpmoduleController
。
class XpmoduleController < ApplicationController
def index
@xpmodule = Xpmodule.find(params[:module_id])
end
def subscribe
flash[:notice] = "You are now subscribed to #{params[:subscription][:title]}"
redirect_to :action => :index
end
end
最初的意图是将模型命名为Module
,这显然不起作用。不过,我仍然希望网址看起来像/module/4711/
,因此我将其添加到我的routes.rb
:
map.connect '/module/:module_id', :controller => 'xpmodule', :action => 'index'
map.connect '/module/:module_id/subscribe', :controller => 'xpmodule',
:action => 'subscribe'
现在我想用Rspec测试这个控制器:
describe XpmoduleController do
fixtures :xpmodules
context "index" do
it "should assign the current xpmodule" do
xpm = mock_model(Xpmodule)
Xpmodule.should_receive(:find).and_return(xpm)
get "index"
assigns[:xpmodule].should be_an_instance_of(Xpmodule)
end
end
end
我得到No route matches {:action=>"index", :controller=>"xpmodule"}
。这当然是正确的,但我不想仅仅为了测试目的添加这条路线。有没有办法告诉Rspec在get
中调用不同的URL?
答案 0 :(得分:3)
据我所知,您正在测试控制器操作而不是路由到该操作。这是两件不同的事情!
首先尝试这个:
it "should map xpmodules controller to /modules url" do
route_for(:controller => "xpmodule", :action => "index").should == "/modules"
end
也申请其他行动。如果要进行反向路由(从url到controller / action),请执行以下操作:
it "should route /modules url to xpmodules controller and index action" do
params_from(:get, "/modules").should == {:controller => "xpmodules", :action => "index"}
end
答案 1 :(得分:1)
头,见墙,墙,见头。 砰
没有得到关于SO的答案是一个肯定的迹象,我应该更加努力。因此,我将/xpmodule
路由明确添加到routes.rb
。只是注意到测试仍然失败。简而言之:
it "should assign the current xpmodule" do
xpm = mock_model(Xpmodule)
Xpmodule.should_receive(:find).and_return(xpm)
get "index", :module_id => 1
assigns[:xpmodule].should be_an_instance_of(Xpmodule)
end
是解决方案。