FactoryGirl kann einem enum validierten Parameter nicht zuweisen - ruby-on-rails, activerecord, rspec, enums, factory-bot

Ich verwende RSpec, FactoryGirl und ActiveRecord. Der folgende Test wird nicht bestanden:

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

Ich habe folgenden Fehler:

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

Ich habe auch das folgende Modell:

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

Und ich habe folgende Fabrik:

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

Es passiert jedoch, wenn ich die Enums im Modell entfernen:

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

Ich möchte das Enum behalten, da es nur eine Reihe von Strings gibt, die ich Rollen repräsentieren möchte.

Ich würde mich über Informationen freuen, die mir helfen werden, FactoryGirl korrekt mit der Enumeration zu verbinden.

Antworten:

1 für die Antwort № 1

In Ihrer Werksdefinition für den Benutzer legen Sie die Rolle mit fest role :student. Enums werden als ganze Zahlen und nicht als Strings gespeichert - damit Ihre Definition funktioniert, benötigen Sie etwas wie role User.roles["student"].

Sehen http://api.rubyonrails.org/classes/ActiveRecord/Enum.html für mehr Details.


0 für die Antwort № 2

Mit @eugens Antwort sehe ich nun, dass ich die Spalte als Integer erstellen soll und sie als String deklariert habe:

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

Ich habe die folgende Migration ausgeführt, um meinen Fehler zu beheben, und es hat geklappt:

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

Verwandte Fragen
Speisekarte