2014-12-22 6 views
1

У меня есть модель, которая использует как ассоциацию, так и атрибут enum.Factory Girl с перечислением и ассоциацией

class ProjectItem < ActiveRecord::Base 
    belongs_to :project 

    enum status: {open: 0, pending: 1, completed: 2} 

Когда я бегу тест на создании действия модели с ассоциацией, я использую build(:model_name).attributes так:

it "creates a new ProjectItem" do 
    expect { 
    post :create, document_project_item: build(:project_item).attributes 
    }.to change(ProjectItem, :count).by(1) 
end 

Это не работает, и я нашел this issue thread that explains why it doesn't work. Основываясь на комментарии, я смог определить, что на таблицах с атрибутом enum, но нет связи, все работает с attributes_for(:model_name), как и ожидалось.

Проблема, похоже, не предлагает работу, хотя я признаю, что не понимаю, что 100% того, что делают методы FactoryGirl за кулисами. Вот завод:

factory :project_item do 
    project 
    name { Faker::Company.bs } 
    description { Faker::Lorem.paragraph } 
    status :open 
    due { Faker::Date.between(2.days.ago, 10.days.from_now) } 
    sequence(:position) {|n| n } 
    completed_at { Faker::Date.between(1.year.ago, Date.today) } 
end 

Я попытался положить целое в status, как хорошо, но я получаю ту же ошибку:

Failure/Error: post :create, project_item: build(:project_item).attributes 
ArgumentError: 
    '0' is not a valid status 
+0

Вы проинспектировали значение статуса в ответе атрибутов_имя или построить (что-то). Атрибуты? Кроме того, попробуйте использовать 'pending' вместо' open' и посмотрите, не получите ли вы ту же ошибку с '1' вместо' 0'. – Humza

+0

Когда я запускаю 'attributes_for' из консоли, я получаю:' {...: status =>: open, ...} ', но он не создает связанный с ним проект. Когда я запускаю 'build (: project_item) .attributes', я получаю:' {... "project_id" => 24, ... "status" => 0, ...} '. Если я изменю «статус» на «ожидающий» или ': pending', он действительно даст мне ту же ошибку с 1 вместо 0. Похоже, что с Rails перечислениями я не смогу строить формы интуитивным способом (с целым числом для значения и строкой для метки), поэтому может быть, что перечисления не собираются облегчать мою жизнь на данный момент. – Shaun

ответ

1

Я открыт для других решений, но это то, что я придумал с обходным путем.

let(:project_attributes) { build(:project_item).attributes.merge(status: 'pending') } 
it "creates a new ProjectItem" do 
    expect { 
    post :create, project_id: project.id, project_item: project_attributes 
    }.to change(ProjectItem, :count).by(1) 
end 
Смежные вопросы