Проблема с "post create" в моем устройстве rspec - PullRequest
8 голосов
/ 23 апреля 2011

[Хорошо ... мой первый вопрос, так что будьте нежнее.]

Я использую devise для своей аутентификации, но у меня есть собственный контроллер для расширения того, что происходит при создании пользователя. Я создаю как "пользователя", так и "агентство" во время регистрации (регистрации).

На маршрутах ...

 devise_for :users, :controllers => {:registrations => "registrations"}

Мой полный контроллер ...

 class RegistrationsController < Devise::RegistrationsController
   def create
     super # creates the @user
     @agency = Agency.create! params[:agency]
     @agency.users << @user
     @agency.owner = @user
     @user.agency = @agency
     @agency.save
     @user.account_admin = true
     @user.save
   end
 end

Моя проблема в том, что я хочу настроить rspec для проверки этого кода. Кажется, код работает, но я стремлюсь к 100% охвату кода в моих спецификациях. Вот вся моя спецификация ...

 require 'spec_helper'
 describe RegistrationsController do
   render_views  
   describe "POST create" do
     it "creates an associated user" do
       @agency = Factory.create( :agency )
       @user = Factory.create( :user, :agency => @agency )
       User.stub(:new).with({'name' => 'pat'}) { @user }
       Agency.stub(:new).with({'name' => 'pat'}) { @agency }
       post :create, :user => {'name' => 'pat'}
       assigns(:user).should be(@user)
     end
   end
 end

Но я получаю сообщение об ошибке при создании сообщения. Вот сообщение об ошибке

 Could not find devise mapping for path "/users?user[name]=pat"

И это (я думаю) соответствующая строка из "рейк-маршрутов"

 user_registration POST   /users(.:format)  {:action=>"create",:controller=>"registrations"}

Есть мысли?

погладить

1 Ответ

11 голосов
/ 20 декабря 2011

В частности, копирование фрагмента из ссылки, на которую ссылается @shanethehat, строка

@request.env["devise.mapping"] = Devise.mappings[:admin]

решает проблему, поставленную в вопросе. Просто поместите эту строку в before_filter для теста контроллера со вкусом Devise. Замените :admin на соответствующий ресурс (обычно :user)

Причина, по которой это работает: описание только SessionsController не позволяет однозначно идентифицировать конкретный ресурс Devise. Например, если ваше приложение имеет ресурсы admin и user, вам может потребоваться 2 SessionsController (s) с 2 наборами спецификаций - по одному для каждого типа ресурса.

В этом случае, чтобы каждый тест работал на нужном ресурсе, вы должны указать Devise, какой из ваших SessionsController (s) вы имеете в виду для каждого набора примеров. Строка выше делает именно это.

...