2010-11-13 17 views
0

J'essaie de tester la sortie d'une vue auxiliaire qui réside dans un espace de noms. L'assistant d'origine se trouve sous app/helpers/admin/events_helper.rb. Le test est à spec/assistants/admin/events_helper_spec.rb et ressemble à ceci (simplifié):Comment puis-je forcer un espace de noms pour un assistant à l'intérieur d'une spécification?

require File.dirname(__FILE__) + '/../../spec_helper' 

describe Admin::EventsHelper do 

    fixtures :events, :users 

    before(:each) do 
    @event = events(:one) 
    @user = users(:one) 
    end 

    it "should include link to admin page for user" do 
    html = helper.event_message(@event) 
    html.should have_selector("a", :href => admin_user_path(@user)) 
    end 

end 

L'aide, ridiculement simplifiée, ressemble à ceci:

module Admin::EventsHelper 
    def event_message(event) 
    link_to(
     event.message, 
     :controller => 'users', :action => 'show', :id => event.user.id) 
    end 
end 

Lorsque la méthode est event_message Appelé à partir d'un contrôleur dans l'espace de noms Admin, il rend le lien comme '/ admin/users /: id' comme prévu. Cependant, appelé à partir de la spécification, il s'affiche sous la forme '/ users /: id', ce qui fait échouer le test.

Comment spécifier l'espace de noms correct à utiliser pour l'assistant dans la spécification?

Merci!

Répondre

2

Je pense que le problème vient de la façon dont Rspec (et le framework de test Rails) gère les contrôleurs. Pour des raisons complexes (OK, raisons pour lesquelles je ne comprends pas), vous n'obtenez pas de véritable ActionController lors du test, vous obtenez à la place une instance de ActionView :: TestCase :: TestController. Lorsque vous utilisez des espaces de noms, le contrôleur de test dans ce cas ne déduit pas correctement le chemin du contrôleur réel, il devine donc "/ users", ce qui est faux.

Longue histoire courte, alors qu'il ya probablement une meilleure façon de le faire, vous pouvez essayer stubbing la méthode du contrôleur qui est appelé par url_for pour générer le lien:

it "should include link to admin page for user" do 
    controller.stub(:url_options).and_return(:host=>"test.host", :protocol=>"http://", :_path_segments=>{:controller=>"admin/users", :action=>"show"}, :script_name=>"") 
    html = helper.event_message(@event) 
    html.should have_selector("a", :href => admin_user_path(@user)) 
end 
+0

Cela fonctionne, merci. Le paramètre _path_segment est le seul dont j'ai besoin, en fait. À votre santé. – Thilo

+0

Fait intéressant, "admin/user" fonctionne même pour d'autres ressources sous l'espace de noms d'administration. Juste pour rire, je l'ai remplacé par "admin/foo", et ça marche toujours. Donc, je suppose que tout ce qu'il fait est de dire au contrôleur d'utiliser l'espace de noms admin lors de la génération des routes - juste ce que je voulais. – Thilo

0

Si j'obtiens votre question correcte, vous demandez à propos de spécifier l'espace de noms du contrôleur qui est défectueux dans les bonnes spécifications?

Si vous UsersController se trouve dans l'espace de noms Admin, alors vous devriez faire ceci:

link_to(event.message, :controller => 'admin/users', :action => 'show', :id => event.user.id) dans votre méthode d'assistance.

Notez la valeur de la clé du contrôleur est admin/users

+0

Merci, mais ce n'est pas spécifications du contrôleur, mais une spécification d'aide. Je n'appelle pas une méthode de contrôleur, j'appelle une méthode d'aide via l'objet "helper", qui est de la classe ActionView :: Base. Voir l'exemple sur http://relishapp.com/rspec/rspec-rails/v/2-1/dir/helper-specs/helper-spec – Thilo