如何在覆盖设计注册控制器时编写控制器测试?
我希望覆盖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