What is the purpose of a `transient do` block in FactoryBot factories?

前端 未结 2 2107

What is the purpose of transient do in FactoryBot factories?

I\'ve seen a lot of factories that begin with something like below.

factory :c         


        
2条回答
  •  一生所求
    2021-02-11 13:15

    Transient attributes are essentially variables local to the factory that do not persist into the created object.

    I have seen two main uses of transient attributes:

    • Controlling/altering the creation of related objects (e.g. accident_count).
    • Altering values assigned to other attribute assignments (e.g. unsold).

    You could, of course, use these transient attributes for anything else you need to code during the object creation.

    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
    

    This lets your test express a concept (similar to a trait), without knowing anything about the implementation:

    FactoryBot.create(:car, make: 'Saturn', accident_count: 3)
    FactoryBot.create(:car, make: 'Toyota', unsold: true)
    

    IMO, I would stick with traits when they work (e.g. unsold, above). But when you need to pass a non-model value (e.g. accident_count), transient attributes are the way to go.

提交回复
热议问题