繼Railscast on Devise and OmniAuth我已經實現了OmniauthCallbacksController < Devise::OmniauthCallbacksController
其中包含一個方法來處理OmniAuth回調:Rspec的:測試重定向在設計:: OmniauthCallbacksController子
def all
user = User.from_omniauth(request.env["omniauth.auth"])
if user.persisted?
sign_in_and_redirect user
else
session["devise.user_attributes"] = user.attributes
redirect_to new_user_registration_url
end
end
alias_method :facebook, :all
的routes.rb:
devise_for :users, controllers: {omniauth_callbacks: "omniauth_callbacks", :sessions => "sessions" }
我想定製這個,所以我想用RSpec來測試它。問題是我如何測試這種方法和重定向?
如果在規範中我把user_omniauth_callback_path(:facebook)
不抱怨不存在的路線,但似乎並沒有實際調用該方法。
根據this answer「控制器測試使用四個HTTP動詞(GET,POST,PUT,DELETE),無論您的控制器是否爲RESTful。」我嘗試get user_...
等,但在這裏它抱怨路線不存在。而事實上如果我做rake routes
就說明了這條路沒有HTTP動詞:
user_omniauth_callback [BLANK] /users/auth/:action/callback(.:format) omniauth_callbacks#(?-mix:facebook)
你能看到我錯過了什麼?
編輯
所以以下調用該方法的this question一個方法是:
controller.send(:all)
但是我再遇到同樣的錯誤提問跑進:
ActionController::RackDelegation#content_type delegated to @_response.content_type, but @_response is nil
完美。在很多層面上都很有幫助,特別是我將其視爲控制器規範而不是功能規範。非常感激! – 2013-05-16 13:00:22
很高興幫助!這讓我跪了一天半。我很高興別人能從我的沮喪中受益!語法遠沒有?如果是這樣,請使用正確的解決方案編輯。謝謝! – 2013-05-16 13:53:24
語法運行完美。我做的唯一的變化是在[我的答案](http://stackoverflow.com/a/9915796/1450420)中找到了spec_helper.rb,這是我的答案。 – 2013-05-16 14:01:26