Создайте заводское значение поля на основе номера, установленного в другом поле на той же фабрике. - PullRequest
2 голосов
/ 24 сентября 2019

У меня есть таблица, где data_value устанавливается на основе option_id.Например,

 option_id: 1 , data_value: `date value`
 option_id: 2, data_value: number
 option_id: 3, data_value: text


  FactoryBot.define do
       factory  :test do
           sequence(:option_id, (1..3).cycle) { |n| n }
           data_value {??} 
        end 
    end

Как заставить FactoryBot генерировать значение data_value на основе option_id?

1 Ответ

1 голос
/ 24 сентября 2019

Вы можете сделать это с помощью after(:build) обратного вызова , который позволит вам что-то делать с сгенерированным объектом после его создания, но до его возвращения.В зависимости от того, как на самом деле работает ваш класс, вы можете не захотеть хранить option_id непосредственно в классе.В этом случае вы можете использовать values объект в блоке, чтобы прочитать исходное значение, переданное на завод.

require 'factory_bot'
require 'ostruct'

FactoryBot.define do
  factory :test, class: OpenStruct do
    sequence(:option_id, (1..3).cycle) { |n| n }

    after(:build) do |o, values|
      o.data_value = case values.option_id
                     when 1
                       Time.now
                     when 2
                       5
                     when 3
                       'hello world'
                     end
    end
  end 
end

puts(FactoryBot.build(:test))
puts(FactoryBot.build(:test))
puts(FactoryBot.build(:test))

Эти последние три строки будут выводить что-то вроде:

#<OpenStruct option_id=1, data_value=2019-09-24 00:44:01 +0000>
#<OpenStruct option_id=2, data_value=5>
#<OpenStruct option_id=3, data_value="hello world">
...