Rails 4: установить поле enum с помощью атрибутов FactoryGirl

У меня есть модель с перечислением в качестве атрибута.

class ApplicationLetter < ActiveRecord::Base
  belongs_to :user
  belongs_to :event

  validates :user, :event, presence: true

  enum status: {accepted: 1, rejected: 0, pending: 2}

end

А также фабрика, которая генерирует эту модель и устанавливает значение для перечисления

FactoryGirl.define do
  factory :application_letter do
    motivation "motivation"
    user
    event
    status :accepted
  end
end

В тесте контроллера я хочу получить действительные атрибуты через фабрику

let(:valid_attributes) { FactoryGirl.build(:application_letter).attributes }

и создать приложение с этими атрибутами.

application = ApplicationLetter.create! valid_attributes

Но я получаю следующую ошибку:

ArgumentError: '1' не является допустимым статусом

Почему статус интерпретируется как строка? Если я меняю статус на заводе, я получаю ту же ошибку, но с соответствующим номером.

3 ответа

Решение
let(:valid_attributes) { FactoryGirl.build(:application_letter).attributes.merge(status: 'accepted') }

Вы можете сделать это более динамично:

FactoryGirl.define do
  factory :application_letter do
    motivation "motivation"
    user
    event
    status { ApplicationLetter.statuses.values.sample }
  end
end

в этом каждый раз вы получите другой статус

ИЛИ, если вы хотите использовать статическое значение, вы должны использовать целое число, потому что enums по умолчанию используют целочисленные значения

Все, что вам нужно на вашем заводе, это status 'accepted',

Другие вопросы по тегам