web-dev-qa-db-ja.com

FactoryBotファクトリーの「transient do」ブロックの目的は何ですか?

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を使用した経験のある人は、洞察を共有できますか?

30
tim_xyz

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"

それが役に立てば幸い。

61
Sam Kah Chiin

一時属性は基本的に、作成されたオブジェクトに保持されないファクトリーにローカルな変数です。

一時属性の主な用途は2つあります。

  • 関連オブジェクトの作成の制御/変更(例:accident_count)。
  • 他の属性の割り当てに割り当てられた値の変更(例:売れ残り)。

もちろん、これらの一時的な属性は、オブジェクトの作成中にコーディングする必要がある他のすべてのものに使用できます。

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)を渡す必要がある場合は、一時的な属性を使用する方法があります。

0
David Hempy