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
в этом каждый раз вы получите другой статус
ИЛИ, если вы хотите использовать статическое значение, вы должны использовать целое число, потому что enum
s по умолчанию используют целочисленные значения