2010-11-19 17 views
3

J'ai un contrôleur qui n'est pas accessible directement, de la manière RESTful traditionnelle, mais uniquement via une URL particulière.Test d'une action de contrôleur RSpec inaccessible directement

Normalement, je suis habitué à utiliser get et post dans les spécifications de mon contrôleur pour appeler les actions du contrôleur. Existe-t-il un moyen que je peux exercer mon contrôleur en visitant une URL particulière?

EDIT:

Voici mon itinéraire:

Larzworld::Application.routes.draw do 

    match '/auth/:provider/callback' => 'authentications#create' 

    devise_for :users, :controllers => {:registrations => "registrations"} 

    root :to => 'pages#home' 
end 

Voici ma spec:

require 'spec_helper' 

describe AuthenticationsController do 

before(:each) do 
    request.env["omniauth.auth"] = {"provider" => "twitter", "uid" => "12345678"} 
end 

describe 'POST create' do 

    it "should find the Authentication using the uid and provider from omniauth" do 
    Authentication.should_receive(:find_by_provider_and_uid) 
    post 'auth/twitter/callback' 
    end 
end 

end 

et voici l'erreur que je reçois:

Failures: 
    1) AuthenticationsController POST create should find the Authentication using the uid and provider from omniauth 
    Failure/Error: post 'auth/twitter/callback' 
    No route matches {:action=>"auth/twitter/callback", :controller=>"authentications"} 
    # ./spec/controllers/authentications_controller_spec.rb:13 

Finished in 0.04878 seconds 
1 example, 1 failure 

Répondre

7

Controller Les tests utilisent les quatre verbes HTTP (G ET, POST, PUT, DELETE), que votre contrôleur soit RESTful ou non. Donc, si vous avez une route non-RESTful (Rails3):

match 'example' => 'story#example' 

les ces deux tests:

require 'spec_helper' 

describe StoryController do 

    describe "GET 'example'" do 
    it "should be successful" do 
     get :example 
     response.should be_success 
    end 
    end 

    describe "POST 'example'" do 
    it "should be successful" do 
     post :example 
     response.should be_success 
    end 
    end 

end 

sera à la fois passe, car la route accepte tout verbe.

EDIT

Je pense que vous mélanger les tests du régulateur et des tests d'itinéraire. Dans le test du contrôleur, vous voulez vérifier que la logique de l'action fonctionne correctement. Dans le test de route, vous vérifiez que l'URL va au bon contrôleur/action, et que le hash params est généré correctement.

Donc, pour tester votre action du contrôleur, il suffit de faire:

post :create, :provider => "twitter"` 

Pour tester la route, utilisez params_from (pour Rspec 1) ou route_to (pour Rspec 2):

describe "routing" do 
    it "routes /auth/:provider/callback" do 
    { :post => "/auth/twitter/callback" }.should route_to(
     :controller => "authentications", 
     :action => "create", 
     :provider => "twitter") 
    end 
end 
+0

Ok, ce C'est ce que je pensais, mais alors regardez mon post édité où je poste mon itinéraire, mon test et mon erreur. Je ne comprends pas pourquoi il ne correspond pas à l'action correcte. – TheDelChop

+0

Voir ma modification. Vous voulez vraiment un test de routage ici, je pense. – zetetic