2011-07-12 112 views
28

我希望覆蓋Devise::RegistrationsController以實現一些自定義功能。要做到這一點,我創建了一個新的RegistrationsController像這樣:如何在覆寫設計註冊控制器時編寫控制器測試?

# /app/controllers/registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 
    def new 
    super 
    end 
end 

,並建立了我的路線是這樣的:

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

,並試圖對其進行測試是這樣的:

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

但這給我一個錯誤:

1) RegistrationsController GET 'new' should be successful 
Failure/Error: get :new 
AbstractController::ActionNotFound: 
    Could not find devise mapping for path "https://stackoverflow.com/users/sign_up". 
    Maybe you forgot to wrap your route inside the scope block? For example: 

     devise_scope :user do 
     match "/some/route" => "some_devise_controller" 
     end 
# ./spec/controllers/registrations_controller_spec.rb:13:in `block (3 levels) in <top (required)>' 

那麼我做錯了什麼?

回答

46

的問題是,設計是無法從測試映射路線回到原來的控制器。這意味着,儘管如果您在瀏覽器中打開它,但您的應用程序仍可以正常工作,但您的控制器測試仍然會失敗。

解決的辦法是,像這樣在每次測試之前的色器件映射添加到請求:

before :each do 
    request.env['devise.mapping'] = Devise.mappings[:user] 
end 
+0

你添加了什麼文件 - 我無法弄清楚,謝謝。 – eWizardII

+0

把它放在你的控制器測試中,就在第一個'describe'塊中。 –

+0

在規範 - 我有控制器registration_controller是我把它放在如下無濟於事: 需要「spec_helper」 描述RegistrationsController做 形容「GET‘編輯’」之前做 :每個做 request.env [ 「devise.mapping」] = Devise.mappings [:用戶] 結束 它「應該是成功的」做 得到「編輯」 response.should be_success 結束 結束 結束 – eWizardII

-1

您的路線應該是這樣的:

devise_for :users, :controllers => { :registrations => "registrations" } do 
    get "https://stackoverflow.com/users/sign_up/:invitation_token" => 'registrations#new' 
end 
+0

這就是我?唯一的區別是hash synatax - >'registrations:'vs':registrations =>'。除非我在Ruby <1.9.2中運行我的應用程序,否則這不應該有所作爲。 –

+0

啊,好的。不知道。從來沒有見過這種語法。謝謝。 –

+0

;)當你習慣它時它會更好!我想它會編輯我的問題,以防萬一它混淆了任何人。 –