Building using strategies
Blueprints boy allows defining blueprint to be built using different strategies. These three are the most common:
| Name | Description |
|---|---|
:create |
Default strategy, initializes object and saves it in database |
:update |
Default strategy for already build blueprints, updates object with new options that are passed |
:new |
Only initialize object, don’t save it to database |
:attributes |
Only return attributes that would be used to build blueprint |
Defining strategies
Each blueprint can define multiple strategies on how it can be built. For example this blueprint
blueprint :sample do
12
end.blueprint :twice do
24
endwill have 2 strategies: :create and :twice. Depending on what strategy you choose when building blueprint you will
get different result. You can choose strategy by using build_with :strategy, :blueprint.
Updating blueprint
Building same blueprint twice with different options will result in :update strategy being used the second time.
blueprint :apple do
Fruit.new 'apple'
end.blueprint :update do |data|
apple.name = data[:name]
end
# Spec
build :apple
expect(apple.name).to eq('apple')
build :apple => {name: 'red apple'}
expect(apple.name).to eq('red apple')Building multiple times
If you want to build same blueprint multiple times (creating object that blueprint creates multiple times). You can use
build! method.
blueprint :apple do
Fruit.new 'apple'
end
# Spec
apple1 = build!(:apple)
apple2 = build!(:apple)
# Different objects but both are instances of Fruit and have name 'apple'
expect(apple1.object_id).not_to eq(apple2.object_id)Factories
When adding factories you can define class and strategy that particular factory is used for.
BlueprintsBoy.factories.add(Fruit, :create) { |data| data.factory.create!(data.attributes) }
BlueprintsBoy.factories.add(Fruit, :update) { |data| blueprint_data(data.name).update_attributes!(data.options) }Summary of build methods
| Method | Strategy |
|---|---|
| build | :create or :update |
| build! | :create |
| build_new | :new |
| build_attributes | :attributes |
| build_with | Passed as first argument |