Функциональные тесты Rails, ошибка маршрутизации - PullRequest
2 голосов
/ 28 января 2010

Я новичок в тестировании, и у меня возникают некоторые трудности при попытке запустить функциональный тест.

У меня есть messages_controller и user_controller здесь. в маршрутах я определил, что ресурсы пользователей имеют ресурсы сообщений has_many.

Теперь я пытаюсь запустить простой тест в контроллере сообщений:

def test_index
  get :index, { :user_id => 1 }
  assert_template 'index'
end

Но получаю ошибку маршрутизации от rails, что он не может найти маршрут к сообщениям. Я не хочу включать маршрут к сообщениям только из-за тестов. Как я могу сказать тесту, что он должен получить доступ по URL / users / messages?

полные маршруты. Rb:

ActionController::Routing::Routes.draw do |map|

  map.login  'login',   :controller => :user_sessions, :action => :new
  map.logout 'logout',  :controller => :user_sessions, :action => :destroy
  map.signin 'signin',  :controller => :users,         :action => :new

  map.connect 'search/:action/:word', :controller => :search
  map.connect 'search/:word',         :controller => :search, :action => :index

  map.resources :forums do |forums| 
    forums.resources :forum_posts, :collection => {:preview => :post }, :as => :posts do |post|
      post.resources :forum_posts, :as => :reply
      post.resources :reports
    end
  end

  map.resources :newsitems, :as => :news do |news|
    news.resources :comments do |comment|
      comment.resources :reports
    end
  end

  map.resource :user_sessions
  map.resources :users, 
                :as => :profiles,
                :controller => :profiles,
                :has_many   => [ :messages ]
  map.resource :profiles
  map.resource :me,            
               :controller => :me,
               :has_many   => [ :messages ]


  map.resources :comments, :has_many => [ :reports ]
  map.resources :forum_posts, :has_many => [ :reports ]
  map.resources :reports

  map.home  '/', :controller => :home
  map.root  :controller => :home

  map.namespace :admin do |admin|
    admin.namespace :forum do |forum|
      forum.resources :categories
      forum.resources :posts
      forum.resources :forums
      forum.root      :controller => :home
    end
    admin.resources :notices
    admin.resources :users
    admin.workflow  'workflow/:action', :controller => :workflow
    admin.resources :newsitems
    admin.resources :reports
    admin.resources :comments    
    admin.root :controller => :home
  end

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

UPDATE

Я заметил, что каждый функциональный тест получает ошибку маршрутизации. Даже самые простые, такие как новостной элемент. Понятия не имею почему.

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Я пересоздал ваш сценарий в пустом приложении rails с кодом маршрутизации, и вы указали тест, и он работал без проблем, как и должно быть. Я вставлю сюда свой код контроллера, так как это единственная часть, которую вы пропустили:

class MessagesController < ApplicationController
  def index
    @messages = User.find(params[:user_id]).messages
  end
end

Если вы делаете в основном то же самое, тогда проблема маршрутизации может быть вызвана конфликтом в вашем файле маршрутизации, что, как я подозреваю, может иметь место. Вы можете опубликовать это? К вашему сведению, я написал статью о тестировании ваших маршрутов , и это было бы очень хорошей идеей, потому что это отлавливало бы ошибки маршрутизации на ранних этапах, прежде чем они столкнутся с контроллерами.

В любом случае, если вы можете опубликовать свои маршруты, я могу посмотреть.

ОБНОВЛЕНИЕ: После просмотра ваших маршрутов, есть пара конфликтов. Вы можете иметь сообщения в качестве подресурса более чем одного другого ресурса, но в вашем контроллере сообщений вам придется учитывать возможность либо params [: me_id], либо params [: profile_id]. Похоже, что они оба на самом деле пользовательская модель, поэтому это может быть так просто:

@user = User.find(params[:me_id] || params[:profile_id])

и вы, вероятно, захотите абстрагировать это в метод, который вы вызываете с помощью before_filter.

Другая проблема заключается в том, что у вас есть два перекрывающихся профиля профиля, и я не уверен, почему. Я не думаю, что это ошибка маршрутизации в тесте, потому что тесты в любом случае обходят механизм маршрутизации. Я думаю, что это ошибка в представлении индекса, потому что оно, вероятно, содержит ссылки на сообщения с неправильно отформатированными URL. Если у вас есть ссылка на сообщение, например, и у вас есть объект @profile, вам нужно будет вызывать их следующим образом:

<%= link_to message.name, profile_message_path(@profile, @message) %>

Однако, если вы используете не вложенные пути, например message_path(@message), произойдет сбой, так как нет вложенных маршрутов сообщений.

0 голосов
/ 11 июля 2013

Это была проблема в моем "путешествии". Они сделали маршруты более строгими в путешествии 1.0.4, которые отображаются только в «тестовой» среде. Это хорошо для "разработки" и "производства".

** Убедитесь, что вы используете точно такие же параметры, как указано в маршрутах **

Либо добавьте:

get :index, :locale => "en"

или в вашем обновлении Gemfile:

gem 'journey', '1.0.3'

Второе решение - это временное решение. В идеале вы должны тестировать ваши маршруты с точными параметрами. Путешествие 1.0.4 намного строже

...