Тесты RSpec с устройством devise: не удалось найти правильное отображение - PullRequest
4 голосов
/ 11 мая 2011

Я пытаюсь запустить спецификации контроллера с устройством 1.3.4.(и заводская девушка) Я следовал инструкциям в git wiki для проекта.Я могу войти в систему как пользователь, используя метод login_user, созданный в макросе, но login_admin завершается ошибкой со следующей ошибкой:

...
sign_in Factory.create(:admin)

Could not find a valid mapping for #<User id: 2023, email: "admin1@gmail.com", .... >

Factory:

Factory.define :user do |f|
  f.sequence(:username) {|n| "user#{n}"}
  f.sequence(:email) {|n| "user#{n}@gmail.com"}
  f.email_confirmation {|fac| fac.email }
  f.password "a12345Den123"
  f.password_confirmation "a12345Den123"
#  f.admin 0
end

Factory.define :admin, :class => User do |f|
  f.sequence(:username) {|n| "admin#{n}"}
  f.sequence(:email) {|n| "admin#{n}@gmail.com"}
  f.email_confirmation {|fac| fac.email }
  f.password "a12345Den123"
  f.password_confirmation "a12345Den123"
  f.admin 1
end

Модуль макроса контроллера:

module ControllerMacros
  def login_admin
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]  #it should map to user because admin is not a model of its own.  It produces the same result either way.
      @admin = Factory.create(:admin)
      sign_in @admin
    end
  end

  def login_user
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:user]
      @user = Factory.create(:user)
      sign_in @user
    end
  end
end

маршруты

devise_for :users
devise_for :admins, :class_name => 'User'

Одним из решений является установка cache_classes = false, однако это не идеально, поскольку я использую spork и не хочу перезапускать его после изменениямодель.

Любая помощь?

Ответы [ 3 ]

6 голосов
/ 26 июля 2011

У меня есть что-то вроде этого в моих маршрутах:

  devise_for :accounts, :controllers => {:confirmations => "confirmations"} do
    put "confirm_account", :to => "confirmations#confirm_account"
    get "login" => "devise/sessions#new", :as => :login
    delete "logout" => "devise/sessions#destroy", :as => :logout
    get "register" => "devise/registrations#new", :as => :register
  end

, поэтому в моем spec / support / controller_macros.rb мне нужно было изменить значение:

  def login_account
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:account]
      @account = Factory.create(:account)
      sign_in(@account)
    end
  end

на

  def login_account
    before(:each) do
      @request.env["devise.mapping"] = Devise.mappings[:account]
      @account = Factory.create(:account)
      sign_in(:account, @account)
    end
  end

обратите внимание на sign_in (область действия, ресурс)

Надеюсь, это поможет.

2 голосов
/ 11 мая 2011

Это из readme устройства:

Устройство также поставляется с маршрутами по умолчанию.Если вам нужно настроить их, вы, вероятно, сможете сделать это с помощью метода devise_for.Он принимает несколько параметров, таких как: class_name,: path_prefix и т. Д., В том числе возможность изменять имена путей для I18n

Поэтому я бы проверил ваш файл маршрутов и убедился, что он там:

devise_for :admins, :class_name => 'User'
0 голосов
/ 02 ноября 2011

Вы можете проверить свой код на наличие нескольких объявлений devise_for :admins в разных местах.Это было причиной такого исключения в моем случае, поскольку это, безусловно, смущает Devise.

...