2010-12-22 42 views
7

我在我的Rails項目中使用了Omniauth,我想在「/ login」路徑後面隱藏「/ auth/facebook」。Rails:如何爲重定向的路由編寫規範?

其實,我寫了一個路線:

match "/login", :to => redirect("/auth/facebook"), :as => :login 

,這實際工作,即鏈接到login_path會重定向到/auth/facebook。但是,如何編寫一個(RSpec)規範來測試此路由(特別是重定向)呢?

請注意,/login不是實際操作,也不是應用程序中定義的方法。

在此先感謝!

+0

[實施例Rspec的路線(https://cbabhusal.wordpress.com/2015/12/15/rails-rspec-examples-of-routing-specs/#更多-1623) – illusionist 2015-12-15 03:33:36

回答

12

因爲你沒有提供有關環境的任何細節,下面的例子假定您正在使用RSpec的2.x和rspec-帶導軌3.

# rspec/requests/redirects_spec.rb 
describe "Redirects" do 
    describe "GET login" do 
    before(:each) do 
     get "/login" 
    end 

    it "redirects to /auth/facebook" do 
     response.code.should == "302" 
     response.location.should == "/auth/facebook" 
    end 
    end 
end 

閱讀請求規格部分rspec-rails瞭解更多詳情。

+0

這個工程!謝謝!關鍵是在#spec/requests/redirects中定義這個規範,就像你所提到的那樣。以前,我是在ApplicationControllerSpec中執行它(導致在ApplicationController中找不到動作「/ login」的錯誤),或者在其中一個規範/路由規範中使用了「* .should route_to blah」(它抱怨說該路線不存在)。 – winstonyw 2010-12-24 03:47:01

0

您應該使用Rack::Test並檢查URL和HTTP狀態代碼

get "/login" 
last_response.status.should == 302 
last_response.headers["Location"].should == "/auth/facebook" 
1

還可以使用:

get "/login" 
response.should redirect_to(path)