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

Dav*_*ite 30 routing routes ruby-on-rails devise ruby-on-rails-3

我希望覆盖Devise::RegistrationsController实现一些自定义功能.为此,我创建了一个RegistrationsController像这样的新东西:

# /app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  def new
    super
  end
end
Run Code Online (Sandbox Code Playgroud)

并设置我的路线,如下所示:

devise_for :users, :controllers => { :registrations => "registrations" }
Run Code Online (Sandbox Code Playgroud)

并试图像这样测试它:

describe RegistrationsController do
  describe "GET 'new'" do
    it "should be successful" do
      get :new
      response.should be_success
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但这给了我一个错误:

 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 <top (required)>'
Run Code Online (Sandbox Code Playgroud)

那么我做错了什么?

Dav*_*ite 47

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

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

before :each do
  request.env['devise.mapping'] = Devise.mappings[:user]
end
Run Code Online (Sandbox Code Playgroud)