What's the difference between the build and create methods in FactoryGirl?

后端 未结 3 1356
时光取名叫无心
时光取名叫无心 2020-12-13 01:59

The Factory Girl introduction delineates the difference between FactoryGirl.build() and FactoryGirl.create():

# Returns a User inst         


        
相关标签:
3条回答
  • 2020-12-13 02:21

    The create() method persists the instance of the model while the build() method keeps it only on memory.

    Personally, I use the create() method only when persistence is really necessary since writing to DB makes testing time consuming.

    e.g.

    I create users to authentication with create() because my authentication engine queries the DB.

    To check if a model has an attribute the build() method will do because no DB access is required.

    it{Factory.build(:user).should respond_to(:name)}
    

    Update

    "There is one exception that build actually 'creates' when you are building associations, i.e your association are no longer in memory but persisted. Keep that in mind" – Shakes

    0 讨论(0)
  • 2020-12-13 02:24

    Using FactoryGirl.build(:factory_name) does not persist to the db and does not call save!, so your Active Record validations will not run. This is much faster, but validations might be important.

    Using FactoryGirl.create(:factory_name) will persist to the db and will call Active Record validations. This is obviously slower but can catch validation errors (if you care about them in your tests).

    0 讨论(0)
  • 2020-12-13 02:34

    FactoryGirl.create() will create new object and associations (if the factory has any) for it. They will all be persisted in a database. Also, it will trigger both model and database validations. Callbacks after(:build) and after(:create) will be called after the factory is saved. Also before(:create) will be called before the factory is saved.

    FactoryGirl.build() won't save an object, but will still make requests to a database if the factory has associations. It will trigger validations only for associated objects. Callback after(:build) will be called after the factory is built.

    Note that in most cases when testing models are best to use build_stubbed for better performance. Read more about it here.

    0 讨论(0)
提交回复
热议问题