FactoryGirl无法分配给枚举验证参数

时间:2016-01-26 21:32:42

标签: ruby-on-rails activerecord rspec enums factory-bot

我正在使用RSpec,FactoryGirl和ActiveRecord。以下测试未通过:

require 'spec_helper'
describe User, type: :model do
    it "has a valid factory" do
            expect(FactoryGirl.create(:user)).to be_valid
    end
end

我有以下错误:

1) User has a valid factory
 Failure/Error: expect(FactoryGirl.create(:user)).to be_valid
 ActiveRecord::RecordInvalid:
   Validation failed: Role can't be blank

我也有以下型号:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable
  enum role: [:admin, :student, :school]
  validates :role, presence: true
end

我有以下工厂:

require 'faker'
FactoryGirl.define do
    factory :user do
            sequence(:email) { |n| "person#{n}@example.com" }
            password Faker::Internet.password(8, 16)
            role :student
    end
end

但是,如果我删除模型中的枚举,它就会通过:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable
  validates :role, presence: true
end

我想保留枚举,因为我只想让一组字符串代表角色。

我希望能够帮助我正确合并FactoryGirl和enum的信息。

2 个答案:

答案 0 :(得分:1)

在用户的工厂定义中,您可以使用role :student设置角色。枚举存储为整数而非字符串 - 为了使您的定义有效,您需要role User.roles["student"]之类的内容。

有关详细信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Enum.html

答案 1 :(得分:0)

在@ eugen的回答中使用,我现在看到我应该将列创建为整数并且我已将其声明为字符串:

class AddRoleToUser < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, null: false
  end
end

我运行了以下迁移来修复我的错误,但它确实有效:

class ChangeRoleRepresentationInTable < ActiveRecord::Migration
  def change
      change_column :users, :role, 'integer USING CAST(role AS integer)', null: false
  end
end