FactoryBotファクトリのtransient do
の目的は何ですか?
以下のようなもので始まる多くの工場を見てきました。
factory :car do
owner nil
other_attribute nil
end
...
このブログでいくつかの情報を見つけました: http://blog.thefrontiergroup.com.au/2014/12/using-factorygirl-easily-create-complex-data-sets-Rails/
しかし、私はまだこれを行う方法と理由を完全に理解していません。 FactoryBotでの私の経験は最小限です。
FactoryBotを使用した経験のある人は、洞察を共有できますか?
transient
属性を使用すると、モデルで属性ではないのデータを渡すことができます。
次の属性を持つcar
というモデルがあるとします。
工場で車のモデルを作成するときに、車の名前を大文字にする必要があります。私たちにできることは:
factory :car do
transient do
# capitalize is not an attribute of the car
capitalize false
end
name { "Jacky" }
purchase_price { 1000 }
model { "Honda" }
after(:create) do |car, evaluator|
car.name.upcase! if evaluator.capitalize
end
end
したがって、自動車工場を作成し、名前を大文字にしたいときはいつでも。できるよ
car = FactoryGirl.create(:car, capitalize: true)
car.name
# => "JACKY"
それが役に立てば幸い。
一時属性は基本的に、作成されたオブジェクトに保持されないファクトリーにローカルな変数です。
一時属性の主な用途は2つあります。
もちろん、これらの一時的な属性は、オブジェクトの作成中にコーディングする必要がある他のすべてのものに使用できます。
factory :car do
transient do
accident_count 0
unsold false
end
owner unsold ? 'new inventory' : nil
after(:create) do |car, evaluator|
create_list(:police_report, evaluator.accident_count, vehicle: car)
end
end
これにより、テストは、実装について何も知らなくても、概念(特性に類似)を表現できます。
FactoryBot.create(:car, make: 'Saturn', accident_count: 3)
FactoryBot.create(:car, make: 'Toyota', unsold: true)
IMO、私は彼らが働くときに特性に固執するでしょう(例えば、売れ残り、上)。ただし、モデル以外の値(例:accident_count)を渡す必要がある場合は、一時的な属性を使用する方法があります。