如何在覆盖设计注册控制器时编写控制器测试?

我希望覆盖Devise::RegistrationsController来实现一些自定义function。 为此,我创建了一个新的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 "/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 ' 

那么我做错了什么?

问题是Devise无法将测试路由映射回原始控制器。 这意味着,如果您的应用程序在浏览器中打开它实际上工作正常,您的控制器测试仍然会失败。

解决方案是在每次测试之前将设计映射添加到请求中,如下所示:

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

您的路线应如下所示:

 devise_for :users, :controllers => { :registrations => "registrations" } do get "/users/sign_up/:invitation_token" => 'registrations#new' end