使用RSpec和不同的路由名称测试Ruby-on-Rails控制器

时间:2010-03-25 14:30:08

标签: ruby-on-rails rspec

我有一个名为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?

2 个答案:

答案 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

是解决方案。