Как писать тесты контроллера, когда вы переопределяете разработку контроллера? - PullRequest
30 голосов
/ 12 июля 2011

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

Так что я делаю не так?

Ответы [ 2 ]

47 голосов
/ 13 июля 2011

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

Решение состоит в том, чтобы добавить отображение devise в запрос перед каждым тестом, например так:

before :each do
  request.env['devise.mapping'] = Devise.mappings[:user]
end
0 голосов
/ 12 июля 2011

Ваш маршрут должен выглядеть так:

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