2010-01-28 6 views
2

Je suis novice en matière de tests, et j'ai quelques difficultés à essayer de faire un test fonctionnel.Tests fonctionnels Rails, erreur de routage

J'ai un messages_controller, et un user_controller ici. dans les routes, j'ai défini que les ressources des utilisateurs has_many ressources de message.

Maintenant, je suis en train de lancer un test simple dans le contrôleur de messages:

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

Mais obtenir une erreur de routage des rails, qu'il ne peut pas trouver une route aux messages. Je ne veux pas inclure une route vers les messages uniquement à cause des tests. Comment puis-je dire au test qu'il doit accéder à partir de l'URL/users/messages?

la pleine routes.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 

MISE À JOUR

J'ai remarqué que tous les tests fonctionnels obtenir une erreur de routage. Même les simplistes aiment les nouvelles. Je ne sais pas pourquoi.

Répondre

3

J'ai recréé votre scénario dans une application rails blancs avec le code de routage et le test que vous avez spécifié, et cela a fonctionné sans problème, comme il se doit. Je vais coller mon code de contrôleur ici puisque c'est la seule partie vous reste:

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

Si le vôtre est en train de faire essentiellement la même chose, alors un problème de routage pourrait être causé par un conflit dans votre fichier de routage, ce qui est ce que je soupçonne pourrait être le cas. Pouvez-vous l'afficher? Pour info, j'ai écrit un article on testing your routes, et ce serait une très bonne idée car cela permettrait d'intercepter les erreurs de routage avant qu'elles n'interfèrent avec les contrôleurs.

De toute façon, si vous pouvez poster vos itinéraires, je peux jeter un oeil.

MISE À JOUR: Après avoir examiné vos itinéraires, il y a quelques conflits. Vous pouvez avoir des messages en tant que sous-ressource de plus d'une autre ressource, mais dans votre contrôleur de messages, vous devrez tenir compte de la possibilité de params [: me_id] ou de params [: profile_id]. On dirait qu'ils sont tous les deux vraiment le modèle de l'utilisateur en dessous, donc il peut être aussi simple que:

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

et vous aurez probablement envie de faire abstraction que dehors dans une méthode que vous appelez avec before_filter.

L'autre problème est que vous avez deux chemins de profils qui se chevauchent, et je ne sais pas pourquoi. Je ne pense pas que ce soit une erreur de routage dans le test, car les tests contournent le moteur de routage de toute façon. Je pense que c'est une erreur dans la vue d'index, car il contient probablement des liens vers des messages avec des URL incorrectement formatées. Si vous avez un lien vers un message, par exemple, et vous avez un objet @profile, alors vous aurez besoin de les appeler comme ceci:

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

Cependant, si vous utilisez des chemins non imbriqués comme message_path(@message), il échouera car il n'y a pas de routes de messages non imbriquées.

+0

c'est ma règle pour les utilisateurs/messages: map.resources: utilisateurs, : as =>: profils, : controller =>: profils, : has_many => [ : messages] devrait-il encore fonctionner? parce que ce n'est pas – Tiago

+0

Merci pour la mise à jour, et j'ai mis à jour ma réponse pour réfléchir. –

+0

merci pour l'aide! J'ai ajouté les routes complètes.rb. Est-il possible qu'il y ait un conflit de route avec les messages? parce que les utilisateurs et le contrôleur de moi l'ont? – Tiago

0

C'était un problème dans ma gemme "voyage". Ils ont fait des routes plus strictes dans le voyage 1.0.4 qui n'apparaissent que dans un environnement "test". C'est bon pour le "développement" et la "production".

** Assurez-vous que vous utilisez exactement les mêmes paramètres que ceux déclarés dans les routes **

Soit ajouter:

get :index, :locale => "en" 

ou dans votre mise à jour Gemfile:

gem 'journey', '1.0.3' 

La deuxième solution est une solution de contournement pour le moment. Idéalement, vous devriez tester vos itinéraires tous les paramètres exacts. Journey 1.0.4 est beaucoup plus stricte

Questions connexes