2010-11-19 5 views
3

Ich habe einen Controller, auf den nicht direkt zugegriffen werden kann, sondern auf traditionelle REST-Weise, aber nur über eine bestimmte URL.Testen einer RSpec-Controller-Aktion, auf die nicht direkt zugegriffen werden kann

Normalerweise bin ich es gewohnt, get und post in meinen Controller-Spezifikationen zu verwenden, um Controller-Aktionen aufzurufen. Gibt es eine Möglichkeit, meinen Controller durch den Besuch einer bestimmten URL zu trainieren?

EDIT:

Hier ist mein Weg ist:

Larzworld::Application.routes.draw do 

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

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

    root :to => 'pages#home' 
end 

Hier meine spec ist:

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 

und hier ist der Fehler, den ich erhalten:

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 

Antwort

7

-Controller Tests verwenden die vier HTTP - Verben (G ET, POST, PUT, DELETE), unabhängig davon, ob Ihr Controller RESTful ist. Also, wenn Sie eine nicht RESTful Route (Rails3):

match 'example' => 'story#example' 

die diese beiden 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 

werden beide Pass, da die Route jedes Verb akzeptiert.

EDIT

Ich glaube, Sie Controller-Tests und Routen Tests sind Vermischung. Im Controller-Test möchten Sie überprüfen, ob die Logik für die Aktion korrekt funktioniert. Im Routentest überprüfen Sie, ob die URL zur richtigen Steuerung/Aktion geht und dass der Params-Hash korrekt generiert wird.

So Ihre Controller-Aktion zu testen, gehen Sie einfach:

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

die Strecke zu testen, verwenden params_from (für Rspec 1) oder route_to (für 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, das Ist das, was ich dachte, aber dann schau dir meinen bearbeiteten Post an, wo ich meine Route, meinen Test und meinen Fehler poste. Ich verstehe nicht, warum es nicht auf die richtige Aktion abgebildet wird. – TheDelChop

+0

Siehe meine Bearbeitung. Sie wollen wirklich einen Routing-Test hier, denke ich. – zetetic

Verwandte Themen