factory_girl 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/Appraisals +3 -3
  2. data/GETTING_STARTED.md +74 -15
  3. data/Gemfile.lock +38 -44
  4. data/NEWS +12 -0
  5. data/gemfiles/3.0.gemfile +1 -1
  6. data/gemfiles/3.0.gemfile.lock +23 -24
  7. data/gemfiles/3.1.gemfile +1 -1
  8. data/gemfiles/3.1.gemfile.lock +19 -19
  9. data/gemfiles/3.2.gemfile +1 -1
  10. data/gemfiles/3.2.gemfile.lock +10 -10
  11. data/lib/factory_girl.rb +39 -37
  12. data/lib/factory_girl/aliases.rb +3 -4
  13. data/lib/factory_girl/attribute.rb +33 -11
  14. data/lib/factory_girl/attribute/association.rb +3 -2
  15. data/lib/factory_girl/attribute/dynamic.rb +3 -2
  16. data/lib/factory_girl/attribute/sequence.rb +1 -2
  17. data/lib/factory_girl/attribute/static.rb +3 -2
  18. data/lib/factory_girl/attribute_assigner.rb +6 -5
  19. data/lib/factory_girl/attribute_list.rb +16 -3
  20. data/lib/factory_girl/callback.rb +7 -3
  21. data/lib/factory_girl/callbacks_observer.rb +1 -0
  22. data/lib/factory_girl/configuration.rb +24 -0
  23. data/lib/factory_girl/declaration.rb +5 -4
  24. data/lib/factory_girl/declaration/association.rb +1 -0
  25. data/lib/factory_girl/declaration/dynamic.rb +1 -0
  26. data/lib/factory_girl/declaration/implicit.rb +1 -0
  27. data/lib/factory_girl/declaration/static.rb +1 -0
  28. data/lib/factory_girl/declaration_list.rb +1 -0
  29. data/lib/factory_girl/definition.rb +22 -3
  30. data/lib/factory_girl/definition_list.rb +31 -0
  31. data/lib/factory_girl/definition_proxy.rb +19 -4
  32. data/lib/factory_girl/evaluation.rb +3 -3
  33. data/lib/factory_girl/evaluator.rb +24 -14
  34. data/lib/factory_girl/evaluator_class_definer.rb +2 -13
  35. data/lib/factory_girl/factory.rb +22 -24
  36. data/lib/factory_girl/factory_runner.rb +6 -3
  37. data/lib/factory_girl/find_definitions.rb +2 -2
  38. data/lib/factory_girl/null_factory.rb +3 -1
  39. data/lib/factory_girl/null_object.rb +1 -0
  40. data/lib/factory_girl/reload.rb +4 -6
  41. data/lib/factory_girl/sequence.rb +3 -2
  42. data/lib/factory_girl/step_definitions.rb +1 -0
  43. data/lib/factory_girl/strategy/attributes_for.rb +1 -1
  44. data/lib/factory_girl/strategy/stub.rb +6 -6
  45. data/lib/factory_girl/strategy_calculator.rb +1 -0
  46. data/lib/factory_girl/strategy_syntax_method_registrar.rb +37 -0
  47. data/lib/factory_girl/syntax.rb +5 -4
  48. data/lib/factory_girl/syntax/blueprint.rb +5 -8
  49. data/lib/factory_girl/syntax/default.rb +18 -6
  50. data/lib/factory_girl/syntax/generate.rb +10 -13
  51. data/lib/factory_girl/syntax/make.rb +8 -11
  52. data/lib/factory_girl/syntax/methods.rb +76 -36
  53. data/lib/factory_girl/syntax/sham.rb +3 -2
  54. data/lib/factory_girl/syntax/vintage.rb +9 -9
  55. data/lib/factory_girl/syntax_runner.rb +1 -0
  56. data/lib/factory_girl/trait.rb +5 -4
  57. data/lib/factory_girl/version.rb +1 -2
  58. data/spec/acceptance/activesupport_instrumentation_spec.rb +15 -2
  59. data/spec/acceptance/callbacks_spec.rb +113 -9
  60. data/spec/acceptance/create_list_spec.rb +1 -1
  61. data/spec/acceptance/global_initialize_with_spec.rb +82 -0
  62. data/spec/acceptance/global_to_create_spec.rb +122 -0
  63. data/spec/acceptance/modify_factories_spec.rb +2 -2
  64. data/spec/acceptance/parent_spec.rb +1 -1
  65. data/spec/acceptance/register_strategies_spec.rb +8 -0
  66. data/spec/acceptance/syntax/vintage_spec.rb +8 -8
  67. data/spec/acceptance/traits_spec.rb +145 -3
  68. data/spec/acceptance/transient_attributes_spec.rb +1 -1
  69. data/spec/factory_girl/attribute_list_spec.rb +66 -1
  70. data/spec/factory_girl/attribute_spec.rb +1 -1
  71. data/spec/factory_girl/definition_proxy_spec.rb +6 -6
  72. data/spec/factory_girl/definition_spec.rb +22 -16
  73. data/spec/factory_girl/factory_spec.rb +6 -4
  74. data/spec/factory_girl/strategy/build_spec.rb +2 -2
  75. data/spec/factory_girl/strategy/create_spec.rb +1 -1
  76. data/spec/factory_girl/strategy/stub_spec.rb +2 -2
  77. data/spec/factory_girl/strategy_calculator_spec.rb +20 -14
  78. data/spec/support/shared_examples/strategy.rb +8 -9
  79. metadata +94 -29
  80. data/gemfiles/2.3.gemfile +0 -7
@@ -22,11 +22,12 @@ module FactoryGirl
22
22
  # value does not provide any tangible benefits over an ascending sequence.
23
23
  #
24
24
  # This syntax was derived from Pete Yandell's machinist.
25
+ # @api private
25
26
  module Sham
26
- module Sham #:nodoc:
27
+ module Sham
27
28
  def self.method_missing(name, *args, &block)
28
29
  if block_given?
29
- ActiveSupport::Deprecation.warn "Sham.sequence is deprecated; use the FactoryGirl.define syntax instead", caller
30
+ ActiveSupport::Deprecation.warn 'Sham.sequence is deprecated; use the FactoryGirl.define syntax instead', caller
30
31
  start_value = args.first
31
32
  FactoryGirl.register_sequence(Sequence.new(name, start_value || 1, &block))
32
33
  else
@@ -21,7 +21,7 @@ module FactoryGirl
21
21
  # Yields: +Factory+
22
22
  # The newly created factory.
23
23
  def self.define(name, options = {})
24
- ActiveSupport::Deprecation.warn "Factory.define is deprecated; use the FactoryGirl.define block syntax to declare your factory.", caller
24
+ ActiveSupport::Deprecation.warn 'Factory.define is deprecated; use the FactoryGirl.define block syntax to declare your factory.', caller
25
25
  factory = FactoryGirl::Factory.new(name, options)
26
26
  proxy = FactoryGirl::DefinitionProxy.new(factory)
27
27
  yield(proxy)
@@ -44,7 +44,7 @@ module FactoryGirl
44
44
  #
45
45
  # Factory.sequence(:email) {|n| "somebody_#{n}@example.com" }
46
46
  def self.sequence(name, start_value = 1, &block)
47
- ActiveSupport::Deprecation.warn "Factory.sequence is deprecated; use the FactoryGirl.define block syntax to declare your sequence.", caller
47
+ ActiveSupport::Deprecation.warn 'Factory.sequence is deprecated; use the FactoryGirl.define block syntax to declare your sequence.', caller
48
48
  FactoryGirl.register_sequence(Sequence.new(name, start_value, &block))
49
49
  end
50
50
 
@@ -57,7 +57,7 @@ module FactoryGirl
57
57
  # Returns:
58
58
  # The next value in the sequence. (Object)
59
59
  def self.next(name)
60
- ActiveSupport::Deprecation.warn "Factory.next is deprecated; use FactoryGirl.generate instead.", caller
60
+ ActiveSupport::Deprecation.warn 'Factory.next is deprecated; use FactoryGirl.generate instead.', caller
61
61
  FactoryGirl.generate(name)
62
62
  end
63
63
 
@@ -86,31 +86,31 @@ module FactoryGirl
86
86
  # # will be used instead.
87
87
  # Factory(:post, user_id: 1)
88
88
  def self.alias(pattern, replace)
89
- ActiveSupport::Deprecation.warn "Factory.alias is deprecated; use FactoryGirl.aliases << [pattern, replace] instead.", caller
89
+ ActiveSupport::Deprecation.warn 'Factory.alias is deprecated; use FactoryGirl.aliases << [pattern, replace] instead.', caller
90
90
  FactoryGirl.aliases << [pattern, replace]
91
91
  end
92
92
 
93
93
  # Alias for FactoryGirl.attributes_for
94
94
  def self.attributes_for(name, overrides = {})
95
- ActiveSupport::Deprecation.warn "Factory.attributes_for is deprecated; use FactoryGirl.attributes_for instead.", caller
95
+ ActiveSupport::Deprecation.warn 'Factory.attributes_for is deprecated; use FactoryGirl.attributes_for instead.', caller
96
96
  FactoryGirl.attributes_for(name, overrides)
97
97
  end
98
98
 
99
99
  # Alias for FactoryGirl.build
100
100
  def self.build(name, overrides = {})
101
- ActiveSupport::Deprecation.warn "Factory.build is deprecated; use FactoryGirl.build instead.", caller
101
+ ActiveSupport::Deprecation.warn 'Factory.build is deprecated; use FactoryGirl.build instead.', caller
102
102
  FactoryGirl.build(name, overrides)
103
103
  end
104
104
 
105
105
  # Alias for FactoryGirl.create
106
106
  def self.create(name, overrides = {})
107
- ActiveSupport::Deprecation.warn "Factory.create is deprecated; use FactoryGirl.create instead.", caller
107
+ ActiveSupport::Deprecation.warn 'Factory.create is deprecated; use FactoryGirl.create instead.', caller
108
108
  FactoryGirl.create(name, overrides)
109
109
  end
110
110
 
111
111
  # Alias for FactoryGirl.build_stubbed.
112
112
  def self.stub(name, overrides = {})
113
- ActiveSupport::Deprecation.warn "Factory.stub is deprecated; use FactoryGirl.build_stubbed instead.", caller
113
+ ActiveSupport::Deprecation.warn 'Factory.stub is deprecated; use FactoryGirl.build_stubbed instead.', caller
114
114
  FactoryGirl.build_stubbed(name, overrides)
115
115
  end
116
116
  end
@@ -120,7 +120,7 @@ module FactoryGirl
120
120
  # Example:
121
121
  # Factory(:user, name: 'Joe')
122
122
  def Factory(name, attrs = {})
123
- ActiveSupport::Deprecation.warn "Factory(:name) is deprecated; use FactoryGirl.create(:name) instead.", caller
123
+ ActiveSupport::Deprecation.warn 'Factory(:name) is deprecated; use FactoryGirl.create(:name) instead.', caller
124
124
  FactoryGirl.create(name, attrs)
125
125
  end
126
126
  end
@@ -1,4 +1,5 @@
1
1
  module FactoryGirl
2
+ # @api private
2
3
  class SyntaxRunner
3
4
  include Syntax::Methods
4
5
  end
@@ -1,17 +1,18 @@
1
1
  module FactoryGirl
2
+ # @api private
2
3
  class Trait
3
- attr_reader :name
4
+ attr_reader :name, :definition
4
5
 
5
- def initialize(name, &block) #:nodoc:
6
+ def initialize(name, &block)
6
7
  @name = name
7
8
  @block = block
8
- @definition = Definition.new
9
+ @definition = Definition.new(@name)
9
10
 
10
11
  proxy = FactoryGirl::DefinitionProxy.new(@definition)
11
12
  proxy.instance_eval(&@block) if block_given?
12
13
  end
13
14
 
14
- delegate :add_callback, :declare_attribute, :to_create, :define_trait,
15
+ delegate :add_callback, :declare_attribute, :to_create, :define_trait, :constructor,
15
16
  :callbacks, :attributes, to: :@definition
16
17
 
17
18
  def names
@@ -1,4 +1,3 @@
1
1
  module FactoryGirl
2
- VERSION = "3.2.0"
2
+ VERSION = '3.3.0'
3
3
  end
4
-
@@ -1,5 +1,18 @@
1
1
  require "spec_helper"
2
2
 
3
+ unless ActiveSupport::Notifications.respond_to?(:subscribed)
4
+ module SubscribedBehavior
5
+ def subscribed(callback, *args, &block)
6
+ subscriber = subscribe(*args, &callback)
7
+ yield
8
+ ensure
9
+ unsubscribe(subscriber)
10
+ end
11
+ end
12
+
13
+ ActiveSupport::Notifications.extend SubscribedBehavior
14
+ end
15
+
3
16
  describe "using ActiveSupport::Instrumentation to track factory interaction" do
4
17
  before do
5
18
  define_model("User", email: :string)
@@ -8,7 +21,7 @@ describe "using ActiveSupport::Instrumentation to track factory interaction" do
8
21
  email "john@example.com"
9
22
 
10
23
  factory :slow_user do
11
- after_build { Kernel.sleep(0.1) }
24
+ after(:build) { Kernel.sleep(0.1) }
12
25
  end
13
26
  end
14
27
 
@@ -22,7 +35,7 @@ describe "using ActiveSupport::Instrumentation to track factory interaction" do
22
35
  FactoryGirl.build(:slow_user)
23
36
  end
24
37
 
25
- time_to_execute.should be_within(0.01).of(0.1)
38
+ time_to_execute.should >= 0.1
26
39
  end
27
40
 
28
41
  it "builds the correct payload" do
@@ -6,35 +6,35 @@ describe "callbacks" do
6
6
 
7
7
  FactoryGirl.define do
8
8
  factory :user_with_callbacks, class: :user do
9
- after_stub { |user| user.first_name = 'Stubby' }
10
- after_build { |user| user.first_name = 'Buildy' }
11
- after_create { |user| user.last_name = 'Createy' }
9
+ after(:stub) { |user| user.first_name = 'Stubby' }
10
+ after(:build) { |user| user.first_name = 'Buildy' }
11
+ after(:create) { |user| user.last_name = 'Createy' }
12
12
  end
13
13
 
14
14
  factory :user_with_inherited_callbacks, parent: :user_with_callbacks do
15
- after_stub { |user| user.last_name = 'Double-Stubby' }
16
- after_build { |user| user.first_name = 'Child-Buildy' }
15
+ after(:stub) { |user| user.last_name = 'Double-Stubby' }
16
+ after(:build) { |user| user.first_name = 'Child-Buildy' }
17
17
  end
18
18
  end
19
19
  end
20
20
 
21
- it "runs the after_stub callback when stubbing" do
21
+ it "runs the after(:stub) callback when stubbing" do
22
22
  user = FactoryGirl.build_stubbed(:user_with_callbacks)
23
23
  user.first_name.should == 'Stubby'
24
24
  end
25
25
 
26
- it "runs the after_build callback when building" do
26
+ it "runs the after(:build) callback when building" do
27
27
  user = FactoryGirl.build(:user_with_callbacks)
28
28
  user.first_name.should == 'Buildy'
29
29
  end
30
30
 
31
- it "runs both the after_build and after_create callbacks when creating" do
31
+ it "runs both the after(:build) and after(:create) callbacks when creating" do
32
32
  user = FactoryGirl.create(:user_with_callbacks)
33
33
  user.first_name.should == 'Buildy'
34
34
  user.last_name.should == 'Createy'
35
35
  end
36
36
 
37
- it "runs both the after_stub callback on the factory and the inherited after_stub callback" do
37
+ it "runs both the after(:stub) callback on the factory and the inherited after(:stub) callback" do
38
38
  user = FactoryGirl.build_stubbed(:user_with_inherited_callbacks)
39
39
  user.first_name.should == 'Stubby'
40
40
  user.last_name.should == 'Double-Stubby'
@@ -45,3 +45,107 @@ describe "callbacks" do
45
45
  user.first_name.should == 'Child-Buildy'
46
46
  end
47
47
  end
48
+
49
+ describe "callbacks using syntax methods without referencing FactoryGirl explicitly" do
50
+ before do
51
+ define_model("User", first_name: :string, last_name: :string)
52
+
53
+ FactoryGirl.define do
54
+ sequence(:sequence_1)
55
+ sequence(:sequence_2)
56
+ sequence(:sequence_3)
57
+
58
+ factory :user do
59
+ after(:stub) { generate(:sequence_3) }
60
+ after(:build) {|user| user.first_name = generate(:sequence_1) }
61
+ after(:create) {|user, evaluator| user.last_name = generate(:sequence_2) }
62
+ end
63
+ end
64
+ end
65
+
66
+ it "works when the callback has no variables" do
67
+ FactoryGirl.build_stubbed(:user)
68
+ FactoryGirl.generate(:sequence_3).should == 2
69
+ end
70
+
71
+ it "works when the callback has one variable" do
72
+ FactoryGirl.build(:user).first_name.should == 1
73
+ end
74
+
75
+ it "works when the callback has two variables" do
76
+ FactoryGirl.create(:user).last_name.should == 1
77
+ end
78
+ end
79
+
80
+ describe "custom callbacks" do
81
+ let(:custom_before) do
82
+ Class.new do
83
+ def result(evaluation)
84
+ evaluation.object.tap do |instance|
85
+ evaluation.notify(:before_custom, instance)
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ let(:custom_after) do
92
+ Class.new do
93
+ def result(evaluation)
94
+ evaluation.object.tap do |instance|
95
+ evaluation.notify(:after_custom, instance)
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ let(:totally_custom) do
102
+ Class.new do
103
+ def result(evaluation)
104
+ evaluation.object.tap do |instance|
105
+ evaluation.notify(:totally_custom, instance)
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ before do
112
+ define_model("User", first_name: :string, last_name: :string) do
113
+ def name
114
+ [first_name, last_name].join(" ")
115
+ end
116
+ end
117
+
118
+ FactoryGirl.register_strategy(:custom_before, custom_before)
119
+ FactoryGirl.register_strategy(:custom_after, custom_after)
120
+ FactoryGirl.register_strategy(:totally_custom, totally_custom)
121
+
122
+ FactoryGirl.define do
123
+ factory :user do
124
+ first_name "John"
125
+ last_name "Doe"
126
+
127
+ before(:custom) {|instance| instance.first_name = "Overridden First" }
128
+ after(:custom) {|instance| instance.last_name = "Overridden Last" }
129
+ callback(:totally_custom) do |instance|
130
+ instance.first_name = "Totally"
131
+ instance.last_name = "Custom"
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ it "runs a custom before callback when the proper strategy executes" do
138
+ FactoryGirl.build(:user).name.should == "John Doe"
139
+ FactoryGirl.custom_before(:user).name.should == "Overridden First Doe"
140
+ end
141
+
142
+ it "runs a custom after callback when the proper strategy executes" do
143
+ FactoryGirl.build(:user).name.should == "John Doe"
144
+ FactoryGirl.custom_after(:user).name.should == "John Overridden Last"
145
+ end
146
+
147
+ it "runs a custom callback without prepending before or after when the proper strategy executes" do
148
+ FactoryGirl.build(:user).name.should == "John Doe"
149
+ FactoryGirl.totally_custom(:user).name.should == "Totally Custom"
150
+ end
151
+ end
@@ -64,7 +64,7 @@ describe "multiple creates and ignored attributes to dynamically build attribute
64
64
  posts_count 5
65
65
  end
66
66
 
67
- after_create do |user, evaluator|
67
+ after(:create) do |user, evaluator|
68
68
  FactoryGirl.create_list(:post, evaluator.posts_count, user: user)
69
69
  end
70
70
  end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'global initialize_with' do
4
+ before do
5
+ define_class('User') do
6
+ attr_accessor:name
7
+
8
+ def initialize(name)
9
+ @name = name
10
+ end
11
+ end
12
+
13
+ define_class('Post') do
14
+ attr_reader :name
15
+
16
+ def initialize(name)
17
+ @name = name
18
+ end
19
+ end
20
+
21
+ FactoryGirl.define do
22
+ initialize_with { new("initialize_with") }
23
+
24
+ trait :with_initialize_with do
25
+ initialize_with { new("trait initialize_with") }
26
+ end
27
+
28
+ factory :user do
29
+ factory :child_user
30
+
31
+ factory :child_user_with_trait do
32
+ with_initialize_with
33
+ end
34
+ end
35
+
36
+ factory :post do
37
+ factory :child_post
38
+
39
+ factory :child_post_with_trait do
40
+ with_initialize_with
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ it 'handles base initialize_with' do
47
+ FactoryGirl.build(:user).name.should == 'initialize_with'
48
+ FactoryGirl.build(:post).name.should == 'initialize_with'
49
+ end
50
+
51
+ it 'handles child initialize_with' do
52
+ FactoryGirl.build(:child_user).name.should == 'initialize_with'
53
+ FactoryGirl.build(:child_post).name.should == 'initialize_with'
54
+ end
55
+
56
+ it 'handles child initialize_with with trait' do
57
+ FactoryGirl.build(:child_user_with_trait).name.should == 'trait initialize_with'
58
+ FactoryGirl.build(:child_post_with_trait).name.should == 'trait initialize_with'
59
+ end
60
+
61
+ it 'handles inline trait override' do
62
+ FactoryGirl.build(:child_user, :with_initialize_with).name.should == 'trait initialize_with'
63
+ FactoryGirl.build(:child_post, :with_initialize_with).name.should == 'trait initialize_with'
64
+ end
65
+
66
+ it 'uses initialize_with globally across FactoryGirl.define' do
67
+ define_class('Company') do
68
+ attr_reader :name
69
+
70
+ def initialize(name)
71
+ @name = name
72
+ end
73
+ end
74
+
75
+ FactoryGirl.define do
76
+ factory :company
77
+ end
78
+
79
+ FactoryGirl.build(:company).name.should == 'initialize_with'
80
+ FactoryGirl.build(:company, :with_initialize_with).name.should == 'trait initialize_with'
81
+ end
82
+ end
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'global to_create' do
4
+ before do
5
+ define_model('User', name: :string)
6
+ define_model('Post', name: :string)
7
+
8
+ FactoryGirl.define do
9
+ to_create {|instance| instance.name = 'persisted!' }
10
+
11
+ trait :override_to_create do
12
+ to_create {|instance| instance.name = 'override' }
13
+ end
14
+
15
+ factory :user do
16
+ name 'John Doe'
17
+
18
+ factory :child_user
19
+
20
+ factory :child_user_with_trait do
21
+ override_to_create
22
+ end
23
+ end
24
+
25
+ factory :post do
26
+ name 'Great title'
27
+
28
+ factory :child_post
29
+
30
+ factory :child_post_with_trait do
31
+ override_to_create
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ it 'handles base to_create' do
38
+ FactoryGirl.create(:user).name.should == 'persisted!'
39
+ FactoryGirl.create(:post).name.should == 'persisted!'
40
+ end
41
+
42
+ it 'handles child to_create' do
43
+ FactoryGirl.create(:child_user).name.should == 'persisted!'
44
+ FactoryGirl.create(:child_post).name.should == 'persisted!'
45
+ end
46
+
47
+ it 'handles child to_create with trait' do
48
+ FactoryGirl.create(:child_user_with_trait).name.should == 'override'
49
+ FactoryGirl.create(:child_post_with_trait).name.should == 'override'
50
+ end
51
+
52
+ it 'handles inline trait override' do
53
+ FactoryGirl.create(:child_user, :override_to_create).name.should == 'override'
54
+ FactoryGirl.create(:child_post, :override_to_create).name.should == 'override'
55
+ end
56
+
57
+ it 'uses to_create globally across FactoryGirl.define' do
58
+ define_model('Company', name: :string)
59
+
60
+ FactoryGirl.define do
61
+ factory :company
62
+ end
63
+
64
+ FactoryGirl.create(:company).name.should == 'persisted!'
65
+ FactoryGirl.create(:company, :override_to_create).name.should == 'override'
66
+ end
67
+ end
68
+
69
+ describe 'global skip_create' do
70
+ before do
71
+ define_model('User', name: :string)
72
+ define_model('Post', name: :string)
73
+
74
+ FactoryGirl.define do
75
+ skip_create
76
+
77
+ trait :override_to_create do
78
+ to_create {|instance| instance.name = 'override' }
79
+ end
80
+
81
+ factory :user do
82
+ name 'John Doe'
83
+
84
+ factory :child_user
85
+
86
+ factory :child_user_with_trait do
87
+ override_to_create
88
+ end
89
+ end
90
+
91
+ factory :post do
92
+ name 'Great title'
93
+
94
+ factory :child_post
95
+
96
+ factory :child_post_with_trait do
97
+ override_to_create
98
+ end
99
+ end
100
+ end
101
+ end
102
+
103
+ it 'does not persist any record' do
104
+ FactoryGirl.create(:user).should be_new_record
105
+ FactoryGirl.create(:post).should be_new_record
106
+ end
107
+
108
+ it 'does not persist child records' do
109
+ FactoryGirl.create(:child_user).should be_new_record
110
+ FactoryGirl.create(:child_post).should be_new_record
111
+ end
112
+
113
+ it 'honors overridden to_create' do
114
+ FactoryGirl.create(:child_user_with_trait).name.should == 'override'
115
+ FactoryGirl.create(:child_post_with_trait).name.should == 'override'
116
+ end
117
+
118
+ it 'honors inline trait to_create' do
119
+ FactoryGirl.create(:child_user, :override_to_create).name.should == 'override'
120
+ FactoryGirl.create(:child_post, :override_to_create).name.should == 'override'
121
+ end
122
+ end