Как вызвать Rails по имени route при тестировании контроллеров с RSpec? - PullRequest
1 голос
/ 17 марта 2011

Я хочу проверить действие постоянной ссылки в моем контроллере статей, который использует именованный маршрут (/ permalink / Terms-of-Use):

map.permalink 'permalink/:permalink', 
              :controller => :articles, :action => :permalink, :as => :permalink

Это спецификация:

describe "GET permalink" do
  it "should visit an article" do
    get "/permalink/@article.permalink"
  end
end

Но я получаю эту ошибку:

ActionController :: RoutingError в 'Постоянная ссылка ArticlesController отображает страницу' Нет совпадений маршрута {: controller => "article",: action => "/ permalink / @article.permalink "}

ОБНОВЛЕНИЕ:

есть идеи, как написать GET?

Ответы [ 2 ]

3 голосов
/ 20 марта 2011

Ошибка в том, что вы передаете полный URL-адрес методу, который ожидает имя одного из методов действия контроллера.Если я правильно понимаю, вы пытаетесь проверить несколько вещей одновременно.

Проверка того, что у маршрута есть имя, отличается от проверки маршрута, отличается от тестирования действия контроллера.Вот как я проверяю действие контроллера (это, вероятно, неудивительно).Обратите внимание, что я совпадаю с вашим именем, а не рекомендую, что бы я использовал.

В spec / controllers / Articles_controller_spec.rb,

describe ArticlesController do
  describe '#permalink' do
    it "renders the page" do
      # The action and its parameter are both named permalink
      get :permalink :permalink => 666
      response.should be_success
      # etc.
    end
  end
end

Вот как я тестирую именованный маршрут только сrspec-rails:

В spec / routing / article_routing_spec.rb,

describe ArticlesController do
  describe 'permalink' do

    it 'has a named route' do
      articles_permalink(666).should == '/permalink/666'
    end

    it 'is routed to' do
      { :get => '/permalink/666' }.should route_to(
        :controller => 'articles', :action => 'permalink', :id => '666')
    end

  end
end

Маршрутный подборщик Должы более лаконичен, но при этом предоставляет хорошее описание и сообщение об ошибке:

describe ArticlesController do
  describe 'permalink' do

    it 'has a named route' do
      articles_permalink(666).should == '/permalink/666'
    end

    it { should route(:get, '/permalink/666').to(
      :controller => 'articles', :action => 'permalink', :id => '666' })

  end
end

У AFAIK ни у RSpec, ни у Ifa нет конкретного, краткого способа проверки именованных маршрутов, но вы можете написать свой собственный сопоставитель.

0 голосов
/ 12 августа 2011
describe "GET permalink" do
  it "should visit an article" do
    get "/permalink/#{@article.permalink}"
  end
end
...