Factorybot - Как установить вложенные атрибуты - PullRequest
0 голосов
/ 11 февраля 2019

Я полагаю, что лучше создать новый вопрос ... Отсюда мой предыдущий вопрос У моего модельного продукта много размеров (вложенные атрибуты)

Я хочу создать фабрики, но я могуне заставить его работать ...

Продукт действителен, если он имеет хотя бы один размер (size_name и quantity)

FactoryBot.define do
  factory :product do
    title { Faker::Artist.name}
    ref   { Faker::Number.number(10)}
    price { Faker::Number.number(2) }
    color { Faker::Color.color_name }
    brand { Faker::TvShows::BreakingBad }
    description { Faker::Lorem.sentence(3) }
    attachments { [
      File.open(File.join(Rails.root,"app/assets/images/seeds/image.jpg")),

    ] }
    user { User.first || association(:user, admin: true)}
    category { Category.first }


    # SOLUTION 1
    factory :size do 
       transient do 
         size_name {["S", "M", "L", "XL"].sample}
          quantity  { Faker::Number.number(2) }
        end
     end
   # SOLUTION 2 
    after(:create) do |product|
       create(:size, product: product)
     end

  # SOLUTION 3 
    initialize_with { attributes }
   # Failure/Error: @product = create(:product, category_id: category.id)
   # NoMethodError:
   # undefined method `save!' for #<Hash:0x007ff12f0d9378>
  end
end

В спецификации контроллера

  before(:each) do 
    sign_in FactoryBot.create(:user, admin: true)
    category = create(:category)
    @product = create(:product, category_id: category.id)
  end

Я не знаю, как написать атрибут размера, мой продукт все еще недействителен (отсутствует размер)

Я получаю ошибку validation failed,Product must exist...

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Вы должны определить фабрику для размера

FactoryBot.define do
  factory :size do 
    size_name { ["S", "M", "L", "XL"].sample }
    quantity  { Faker::Number.number(2) }
  end
end

и продукта

FactoryBot.define do
  factory :product do
    association :size
    title { Faker::Artist.name}
    ...
  end
end

или добавить обратный вызов сборки в: фабрика продукта

after :build do |product|
  product.sizes << create(:size)
end
0 голосов
/ 11 февраля 2019

Создать фабрику для размеров

FactoryBot.define do
  factory :size do
    size_name {["S", "M", "L", "XL"].sample}
    quantity  { Faker::Number.number(2) }
    product
  end
end

и одну для продуктов

 FactoryBot.define do
   factory :product do
    title { Faker::Artist.name}
    ref   { Faker::Number.number(10)}
    price { Faker::Number.number(2) }
    color { Faker::Color.color_name }
    brand { Faker::TvShows::BreakingBad }
    description { Faker::Lorem.sentence(3) }
    attachments { [
      File.open(File.join(Rails.root,"app/assets/images/seeds/image.jpg")),
    ] }
    user { User.first || association(:user, admin: true)}
    category 
  end
end
...