2013-08-18 4 views
0

Я пытаюсь написать rspec-тест для создания действия. Контроллер - OrderController. Модель заказа имеет много позиций. Я не знаю, как я могу сделать этот призыв:Rspec, factory_girl - Проверить действие с моделью with_many

сообщение: создание, заказ: FactoryGirl.build (: заказ) .attributes

Но это не потому, что моя проверка, что, говорит: Заказ должен быть на Меньше ОДНИМ позициям. Я думаю, что я должен создать заказ с позицией.

Большое спасибо.

+0

То, что вы просите, может быть выполнено (создать заказ с помощью LineItems ...). Но это не решит вашу проблему. Поскольку # атрибуты, которые вы вызываете, не будут содержать позиции в возвращаемом хэше. Вы должны использовать литеральный хеш или генерировать его через вспомогательный функционал, если это необходимо. Я не думаю, что здесь разумно использовать FactoryGirl (по крайней мере, из контекста, который я вижу). – jurglic

ответ

1

Вы можете определить ассоциации в factory_girl.

factory :order_line do 
    #some attributes 

    order 
end 

factory :order do 
    #some attributes   

    #the line's count you want to create 
    ignore do 
     lines_count 5 
    end 

    after(:create) do |order, evaluator| 
     FactoryGirl.create_list(:order_line, evaluator.lines_count, order: order) 
    end 
end 

Итак, при создании заказа с использованием factory_girl вы также создадите несколько строк.

+0

@ User426891 Вышеуказанное взято из https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#associations, с помощью которого вы можете получить дополнительную информацию о FactoryGirl. –

1

Вы можете создавать связанные объекты с помощью FactoryGirl. Тем не менее, у вас есть два варианта:

1.) Ручной/явный подход - здесь вы передаете line_items в заводском вызов:

FactoryGirl.build(:order, line_items: [build(:line_item), build(:line_item)] 

2.) Автоматический подход - настроить фабрику, чтобы всегда включать, по меньшей мере, одну линию пункт:

В ваших заводах файл:

factory :order do 
    # attrs 

    after :build do |order, ev| 
    order.line_items << build(:line_item) 
    end 
end 

Это будет работать для создания одного Line_Item по умолчанию с атрибутами по умолчанию. Если вы хотите иметь более конкретные атрибуты, вы должны вернуться к использованию первого подхода.