Как написать тесты контроллера, когда вы переопределяете контроллер регистрации разработки?

Я хочу переопределить 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 "/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)>'

Так что я делаю неправильно?

Ответ 1

Проблема заключается в том, что Devise не может отобразить маршруты из теста обратно на исходный контроллер. Это означает, что, хотя ваше приложение действительно работает нормально, если вы откроете его в браузере, ваши тесты контроллера все равно будут терпеть неудачу.

Решение состоит в том, чтобы добавить конфигурацию разработки к запросу перед каждым тестом следующим образом:

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

Ответ 2

Ваш маршрут должен выглядеть следующим образом:

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