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

前端 未结 2 1056
-上瘾入骨i
-上瘾入骨i 2021-02-11 12:35

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:02

    transient attributes allow you to pass in data that isn’t an attribute on the model.

    Say you have a model called car with the following attributes:

    • name
    • purchase_price
    • model

    You want to capitalize the name of the car when you create the car model in the factory. What we can do is:

    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
    

    Hence, whenever you create the car factory and you want to capitalize the name. You can do

    car = FactoryGirl.create(:car, capitalize: true)
    car.name
    # => "JACKY"
    

    Hope it helps.

提交回复
热议问题