RSpec, Devise-не удалось найти допустимую ошибку отображения

У меня есть модель пользователя Devise, и в моем приложении у меня есть различные роли, которые я указываю через перечисление в моей модели пользователя. При выполнении тестов для роли администратора, я получаю следующую ошибку при выполнении тестов RSpec с Devise. Я пробовал некоторые другие ответы на подобные вопросы, но ничего не работает. Надеюсь, вы укажете мне правильное направление. Спасибо!

RuntimeError:
   Could not find a valid mapping for {:email=>"collin_cain@torpdoyle.info", :password=>"12345678", :password_confirmation=>"12345678", :role=>2}

Вот модель пользователя:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :comments

  enum role: [:member, :moderator, :admin]

  before_save :set_default_role

  def set_default_role
    self.role ||= 0
  end
end

Фабрика пользователей:

FactoryGirl.define do
  factory :user do
    email { Faker::Internet.email }
    password "12345678"
    password_confirmation "12345678"
    role 0
  end
end

Спецификации контроллеров категорий

require 'rails_helper'

RSpec.describe Admin::CategoriesController, type: :controller do

    it 'should redirect to sign in path for non signed users' do
        get :index
        expect(response).to redirect_to(new_user_session_path)
    end

    it 'should redirect to root path for non admin users' do
        user = create(:user)
        sign_in user
        get :index
        expect(response).to redirect_to(root_path)
    end

    describe 'GET #index' do
        context 'when admin signed in' do
            it 'renders the index template' do
                admin = attributes_for(:user, role: 2)
                sign_in admin
                get :index
                expect(response).to render_template(:index)
            end

            it 'assigns a list of categories' do
                admin = attributes_for(:user, role: 2)
                sign_in admin
                category = create(:category)
                expect(assigns(:categories)).to eq([category])
            end
        end
    end
end

и файл маршрутов

Rails.application.routes.draw do
  devise_for :users

  namespace :admin do
    get '', to: 'dashboard#index', as: '/'

    resources :categories
  end

  resources :topics do
    resources :comments, only: :create
  end

  resources :categories do
    resources :topics
  end

  root 'categories#index'
end

Я также добавляю пользовательскую схему

  create_table "users", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.inet     "current_sign_in_ip"
    t.inet     "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.integer  "role"
    t.string   "image"
  end

ОБНОВЛЕНИЕ:

Я обновил admin categories controller spec, в частности, метод sign_in Devise от sign_in user до sign_in (: admin, user), как показано ниже.

describe 'GET #index' do
        context 'when admin signed in' do
            it 'renders the index template' do
                user = create(:user)
                user.role = 2
                sign_in(:admin, user)
                get :index
                expect(response).to render_template(:index)
            end
...

Теперь я получаю следующую ошибку

1) Admin::CategoriesController GET #index when admin signed in renders the index template
     Failure/Error: expect(response).to render_template(:index)
       expecting <"index"> but was a redirect to <http://test.host/users/sign_in>

По какой-то причине администратор не входит, я включил в rails_helper помощников по тестированию Devise.RB файл, к сожалению ошибка продолжается. Любая помощь будет очень признательна.

2 ответа

  1. Объявлена ли роль в миграции как

    t.integer :role
    

    Поскольку это должно быть там, чтобы быть включено в созданную структуру миграции.

    Если нет

    Добавьте строку, в вашей базе данных отбросьте таблицу и запустите грабли снова

  2. Я смог решить свой собственный вопрос и решил опубликовать ответ в надежде, что он поможет кому-то в будущем.

    Вместо установки роли пользователя admin в файле admin_categories_controller_spec я добавил вложенную фабрику внутри фабрики пользователей.

    FactoryGirl.define do
      factory :user do
        email { Faker::Internet.email }
        password "12345678"
        password_confirmation "12345678"
        role 0
    
        factory :admin do
            role 2
        end
      end
    end
    

    и тест заканчивается так:

    describe 'GET #index' do
            context 'when admin signed in' do
                it 'renders the index template' do
                    admin = create(:admin)
                    sign_in admin
                    get :index
                    expect(response).to render_template(:index)
                end
    
                it 'assigns a list of categories' do
                    admin = create(:admin)
                    sign_in admin
                    category = create(:category)
                    get :index
                    expect(assigns(:categories)).to eq([category])
                end
            end
        end