Вы можете сделать это с помощью 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">