Тестирование контроллера Ruby-on-Rails с RSpec и другим именем маршрута - PullRequest
2 голосов
/ 25 марта 2010

У меня есть модель Rails с именем Xpmodule с соответствующим контроллером 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, которая по понятным причинам не работает. Однако я все еще хочу, чтобы URL выглядели как /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, чтобы он вызывал другой URL в get?

Ответы [ 2 ]

3 голосов
/ 26 марта 2010

Насколько я могу судить, вы тестируете действие контроллера, а не маршрутизируете его. Это две разные вещи!

Попробуйте для начала:

it "should map xpmodules controller to /modules url" do
  route_for(:controller => "xpmodule", :action => "index").should == "/modules"
end

Подать заявку и на другие действия. Если вы хотите сделать обратную маршрутизацию (от URL до контроллера / действия), то сделайте следующее:

it "should route /modules url to xpmodules controller and index action" do
  params_from(:get, "/modules").should == {:controller => "xpmodules", :action => "index"}
end
1 голос
/ 26 марта 2010

Голова, встреча стены, Стена, встреча головы. бац .

Отсутствие ответа на вопрос 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

это решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...