factory_girl 2.0.4 → 2.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CONTRIBUTION_GUIDELINES.md +1 -0
- data/GETTING_STARTED.md +28 -4
- data/Gemfile +2 -1
- data/Gemfile.lock +6 -2
- data/features/factory_girl_steps.feature +17 -0
- data/features/step_definitions/database_steps.rb +22 -0
- data/features/support/factories.rb +13 -0
- data/features/support/test.db +0 -0
- data/lib/factory_girl/aliases.rb +1 -3
- data/lib/factory_girl/attribute.rb +16 -8
- data/lib/factory_girl/attribute/association.rb +0 -3
- data/lib/factory_girl/attribute/callback.rb +0 -2
- data/lib/factory_girl/attribute/dynamic.rb +1 -3
- data/lib/factory_girl/attribute/static.rb +1 -1
- data/lib/factory_girl/attribute_list.rb +30 -9
- data/lib/factory_girl/factory.rb +1 -1
- data/lib/factory_girl/proxy.rb +7 -5
- data/lib/factory_girl/proxy/attributes_for.rb +8 -3
- data/lib/factory_girl/proxy/build.rb +12 -3
- data/lib/factory_girl/proxy/stub.rb +12 -3
- data/lib/factory_girl/sequence.rb +2 -2
- data/lib/factory_girl/step_definitions.rb +3 -2
- data/lib/factory_girl/version.rb +1 -1
- data/spec/acceptance/attribute_aliases_spec.rb +0 -1
- data/spec/acceptance/attributes_for_spec.rb +0 -1
- data/spec/acceptance/attributes_ordered_spec.rb +24 -6
- data/spec/acceptance/build_list_spec.rb +0 -1
- data/spec/acceptance/build_spec.rb +0 -1
- data/spec/acceptance/build_stubbed_spec.rb +0 -1
- data/spec/acceptance/callbacks_spec.rb +0 -1
- data/spec/acceptance/create_list_spec.rb +0 -1
- data/spec/acceptance/create_spec.rb +0 -1
- data/spec/acceptance/default_strategy_spec.rb +0 -1
- data/spec/acceptance/definition_spec.rb +0 -1
- data/spec/acceptance/definition_without_block_spec.rb +0 -1
- data/spec/acceptance/overrides_spec.rb +0 -1
- data/spec/acceptance/parent_spec.rb +18 -1
- data/spec/acceptance/sequence_spec.rb +0 -1
- data/spec/acceptance/syntax/blueprint_spec.rb +0 -1
- data/spec/acceptance/syntax/generate_spec.rb +0 -1
- data/spec/acceptance/syntax/make_spec.rb +0 -1
- data/spec/acceptance/syntax/sham_spec.rb +0 -1
- data/spec/acceptance/syntax/vintage_spec.rb +27 -29
- data/spec/acceptance/traits_spec.rb +0 -1
- data/spec/acceptance/transient_attributes_spec.rb +68 -0
- data/spec/factory_girl/aliases_spec.rb +19 -21
- data/spec/factory_girl/attribute/association_spec.rb +16 -24
- data/spec/factory_girl/attribute/callback_spec.rb +14 -15
- data/spec/factory_girl/attribute/dynamic_spec.rb +41 -45
- data/spec/factory_girl/attribute/implicit_spec.rb +18 -30
- data/spec/factory_girl/attribute/sequence_spec.rb +11 -13
- data/spec/factory_girl/attribute/static_spec.rb +13 -20
- data/spec/factory_girl/attribute_list_spec.rb +9 -1
- data/spec/factory_girl/attribute_spec.rb +17 -28
- data/spec/factory_girl/definition_proxy_spec.rb +131 -82
- data/spec/factory_girl/deprecated_spec.rb +15 -36
- data/spec/factory_girl/factory_spec.rb +106 -135
- data/spec/factory_girl/find_definitions_spec.rb +7 -6
- data/spec/factory_girl/proxy/attributes_for_spec.rb +23 -32
- data/spec/factory_girl/proxy/build_spec.rb +6 -80
- data/spec/factory_girl/proxy/create_spec.rb +24 -89
- data/spec/factory_girl/proxy/stub_spec.rb +14 -73
- data/spec/factory_girl/proxy_spec.rb +53 -53
- data/spec/factory_girl/registry_spec.rb +13 -29
- data/spec/factory_girl/sequence_spec.rb +24 -72
- data/spec/factory_girl_spec.rb +10 -5
- data/spec/spec_helper.rb +5 -79
- data/spec/support/macros/define_constant.rb +86 -0
- data/spec/support/shared_examples/proxy.rb +99 -0
- metadata +34 -20
- data/spec/acceptance/acceptance_helper.rb +0 -11
@@ -12,6 +12,11 @@ describe FactoryGirl::AttributeList, "#define_attribute" do
|
|
12
12
|
subject.to_a.should == [static_attribute, dynamic_attribute]
|
13
13
|
end
|
14
14
|
|
15
|
+
it "returns the attribute" do
|
16
|
+
subject.define_attribute(static_attribute).should == static_attribute
|
17
|
+
subject.define_attribute(dynamic_attribute).should == dynamic_attribute
|
18
|
+
end
|
19
|
+
|
15
20
|
it "raises if an attribute has already been defined" do
|
16
21
|
expect {
|
17
22
|
2.times { subject.define_attribute(static_attribute) }
|
@@ -49,7 +54,6 @@ describe FactoryGirl::AttributeList, "#add_callback" do
|
|
49
54
|
let(:valid_callback_names) { [:after_create, :after_build, :after_stub] }
|
50
55
|
let(:invalid_callback_names) { [:before_create, :before_build, :bogus] }
|
51
56
|
|
52
|
-
|
53
57
|
it "allows for defining adding a callback" do
|
54
58
|
subject.add_callback(:after_create) { "Called after_create" }
|
55
59
|
|
@@ -59,6 +63,10 @@ describe FactoryGirl::AttributeList, "#add_callback" do
|
|
59
63
|
proxy.callbacks[:after_create].first.call.should == "Called after_create"
|
60
64
|
end
|
61
65
|
|
66
|
+
it "returns the callback" do
|
67
|
+
subject.add_callback(:after_create) { "Called after_create" }.should be_a(FactoryGirl::Attribute::Callback)
|
68
|
+
end
|
69
|
+
|
62
70
|
it "allows valid callback names to be assigned" do
|
63
71
|
valid_callback_names.each do |callback_name|
|
64
72
|
expect do
|
@@ -1,43 +1,32 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe FactoryGirl::Attribute do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should have a name" do
|
10
|
-
@attr.name.should == @name
|
11
|
-
end
|
4
|
+
let(:name) { "user" }
|
5
|
+
let(:proxy) { stub("proxy") }
|
6
|
+
subject { FactoryGirl::Attribute.new(name) }
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
end
|
8
|
+
its(:name) { should == name.to_sym }
|
9
|
+
it { should_not be_association }
|
16
10
|
|
17
|
-
it "
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
@proxy.should have_received.set.never
|
11
|
+
it "doesn't set any attributes on a proxy when added" do
|
12
|
+
proxy.stubs(:set)
|
13
|
+
subject.add_to(proxy)
|
14
|
+
proxy.should have_received(:set).never
|
22
15
|
end
|
23
16
|
|
24
|
-
it "
|
17
|
+
it "raises an error when defining an attribute writer" do
|
25
18
|
error_message = %{factory_girl uses 'f.test value' syntax rather than 'f.test = value'}
|
26
|
-
|
19
|
+
expect {
|
27
20
|
FactoryGirl::Attribute.new('test=')
|
28
|
-
}.
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should convert names to symbols" do
|
32
|
-
FactoryGirl::Attribute.new('name').name.should == :name
|
21
|
+
}.to raise_error(FactoryGirl::AttributeDefinitionError, error_message)
|
33
22
|
end
|
34
23
|
|
35
|
-
it "
|
36
|
-
(
|
24
|
+
it "returns nil when compared to a non-attribute" do
|
25
|
+
(subject <=> "foo").should be_nil
|
37
26
|
end
|
38
27
|
|
39
|
-
it "
|
40
|
-
|
41
|
-
(
|
28
|
+
it "uses priority to perform comparisons" do
|
29
|
+
second_attribute = FactoryGirl::Attribute.new('name')
|
30
|
+
(subject <=> second_attribute).should be_zero
|
42
31
|
end
|
43
32
|
end
|
@@ -15,20 +15,22 @@ describe FactoryGirl::DefinitionProxy do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should add a static attribute when an attribute is defined with a value" do
|
18
|
-
attribute = 'attribute'
|
19
|
-
|
20
|
-
|
21
|
-
mock(factory).define_attribute(attribute)
|
18
|
+
attribute = stub('attribute', :name => :name)
|
19
|
+
FactoryGirl::Attribute::Static.stubs(:new => attribute)
|
20
|
+
factory.stubs(:define_attribute)
|
22
21
|
subject.add_attribute(:name, 'value')
|
22
|
+
factory.should have_received(:define_attribute).with(attribute)
|
23
|
+
FactoryGirl::Attribute::Static.should have_received(:new).with(:name, "value")
|
23
24
|
end
|
24
25
|
|
25
26
|
it "should add a dynamic attribute when an attribute is defined with a block" do
|
26
|
-
attribute = 'attribute'
|
27
|
-
stub(attribute).name { :name }
|
27
|
+
attribute = stub('attribute', :name => :name)
|
28
28
|
block = lambda {}
|
29
|
-
|
30
|
-
|
29
|
+
FactoryGirl::Attribute::Dynamic.stubs(:new => attribute)
|
30
|
+
factory.stubs(:define_attribute)
|
31
31
|
subject.add_attribute(:name, &block)
|
32
|
+
FactoryGirl::Attribute::Dynamic.should have_received(:new).with(:name, block)
|
33
|
+
factory.should have_received(:define_attribute).with(attribute)
|
32
34
|
end
|
33
35
|
|
34
36
|
it "should raise for an attribute with a value and a block" do
|
@@ -54,103 +56,150 @@ describe FactoryGirl::DefinitionProxy do
|
|
54
56
|
|
55
57
|
describe "adding an attribute using a in-line sequence" do
|
56
58
|
it "should create the sequence" do
|
57
|
-
|
59
|
+
FactoryGirl::Sequence.stubs(:new)
|
58
60
|
subject.sequence(:name) {}
|
61
|
+
FactoryGirl::Sequence.should have_received(:new).with(:name, 1)
|
59
62
|
end
|
60
63
|
|
61
64
|
it "should create the sequence with a custom default value" do
|
62
|
-
|
65
|
+
FactoryGirl::Sequence.stubs(:new)
|
63
66
|
subject.sequence(:name, "A") {}
|
67
|
+
FactoryGirl::Sequence.should have_received(:new).with(:name, "A")
|
64
68
|
end
|
69
|
+
end
|
65
70
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
71
|
+
it "adds an implicit attribute when passed an undefined method without arguments or a block" do
|
72
|
+
factory.stubs(:define_attribute)
|
73
|
+
attribute = stub('attribute', :name => :name)
|
74
|
+
FactoryGirl::Attribute::Implicit.stubs(:new => attribute)
|
75
|
+
subject.send(:name)
|
76
|
+
FactoryGirl::Attribute::Implicit.should have_received(:new).with(:name, factory)
|
77
|
+
factory.should have_received(:define_attribute).with(attribute)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe FactoryGirl::DefinitionProxy, "with a factory mock" do
|
82
|
+
before do
|
83
|
+
define_class("FactoryMock") do
|
84
|
+
def add_callback(callback, &block)
|
85
|
+
[callback, block.call]
|
86
|
+
end
|
87
|
+
|
88
|
+
def to_create(&block)
|
89
|
+
block.call
|
90
|
+
end
|
72
91
|
end
|
73
92
|
end
|
74
93
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
94
|
+
let(:factory_mock) { FactoryMock.new }
|
95
|
+
subject { FactoryGirl::DefinitionProxy.new(factory_mock) }
|
96
|
+
|
97
|
+
it "defines after_build callbacks" do
|
98
|
+
subject.after_build { "after_build value" }.should == [:after_build, "after_build value"]
|
99
|
+
end
|
100
|
+
|
101
|
+
it "defines after_create callbacks" do
|
102
|
+
subject.after_create { "after_create value" }.should == [:after_create, "after_create value"]
|
103
|
+
end
|
104
|
+
|
105
|
+
it "defines after_stub callbacks" do
|
106
|
+
subject.after_stub { "after_stub value" }.should == [:after_stub, "after_stub value"]
|
79
107
|
end
|
80
108
|
|
81
|
-
it "
|
82
|
-
|
83
|
-
subject.after_create {}
|
84
|
-
factory.attributes.should include('after_create callback')
|
109
|
+
it "defines to_create" do
|
110
|
+
subject.to_create { "to_create value" }.should == "to_create value"
|
85
111
|
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe FactoryGirl::DefinitionProxy, "adding attributes" do
|
115
|
+
let(:factory) { FactoryGirl::Factory.new(:object) }
|
116
|
+
subject { FactoryGirl::DefinitionProxy.new(factory) }
|
117
|
+
let(:attribute) { stub("created attribute") }
|
118
|
+
let(:block) { lambda { } }
|
119
|
+
let(:attribute_name) { :full_name }
|
120
|
+
let(:attribute_value) { "passed value" }
|
121
|
+
|
122
|
+
before { factory.stubs(:define_attribute) }
|
123
|
+
|
124
|
+
context "when a block is passed" do
|
125
|
+
before { FactoryGirl::Attribute::Dynamic.stubs(:new => attribute) }
|
126
|
+
|
127
|
+
it "creates a dynamic attribute" do
|
128
|
+
subject.add_attribute(attribute_name, &block)
|
129
|
+
FactoryGirl::Attribute::Dynamic.should have_received(:new).with(attribute_name, block)
|
130
|
+
factory.should have_received(:define_attribute).with(attribute)
|
131
|
+
end
|
86
132
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
133
|
+
it "creates a dynamic attribute without the method being defined" do
|
134
|
+
subject.send(attribute_name, &block)
|
135
|
+
FactoryGirl::Attribute::Dynamic.should have_received(:new).with(attribute_name, block)
|
136
|
+
factory.should have_received(:define_attribute).with(attribute)
|
137
|
+
end
|
91
138
|
end
|
92
139
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
140
|
+
context "when a value is passed" do
|
141
|
+
before { FactoryGirl::Attribute::Static.stubs(:new => attribute) }
|
142
|
+
|
143
|
+
it "creates a static attribute" do
|
144
|
+
subject.add_attribute(attribute_name, attribute_value)
|
145
|
+
FactoryGirl::Attribute::Static.should have_received(:new).with(attribute_name, attribute_value)
|
146
|
+
factory.should have_received(:define_attribute).with(attribute)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "creates a static attribute without the method being defined" do
|
150
|
+
subject.send(attribute_name, attribute_value)
|
151
|
+
FactoryGirl::Attribute::Static.should have_received(:new).with(attribute_name, attribute_value)
|
152
|
+
factory.should have_received(:define_attribute).with(attribute)
|
153
|
+
end
|
100
154
|
end
|
101
155
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
subject.association(name, overrides)
|
109
|
-
factory.attributes.should include(attr)
|
156
|
+
context "when a block and value are passed" do
|
157
|
+
it "raises an exception" do
|
158
|
+
expect do
|
159
|
+
subject.add_attribute(attribute_name, attribute_value) { "block" }
|
160
|
+
end.to raise_error(FactoryGirl::AttributeDefinitionError, "Both value and block given")
|
161
|
+
end
|
110
162
|
end
|
163
|
+
end
|
111
164
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
165
|
+
describe FactoryGirl::DefinitionProxy, "#association" do
|
166
|
+
let(:factory) { FactoryGirl::Factory.new(:object) }
|
167
|
+
subject { FactoryGirl::DefinitionProxy.new(factory) }
|
168
|
+
let(:attribute) { stub("attribute") }
|
169
|
+
let(:association_name) { :author }
|
170
|
+
let(:factory_name) { :user }
|
171
|
+
|
172
|
+
before do
|
173
|
+
FactoryGirl::Attribute::Association.stubs(:new => attribute)
|
174
|
+
factory.stubs(:define_attribute)
|
118
175
|
end
|
119
176
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
177
|
+
context "with a factory set in the hash" do
|
178
|
+
let(:options) { { :factory => factory_name, :name => "John Doe" } }
|
179
|
+
|
180
|
+
it "defines an association attribute with the factory name" do
|
181
|
+
subject.association(association_name, options)
|
182
|
+
|
183
|
+
factory.should have_received(:define_attribute).with(attribute)
|
184
|
+
FactoryGirl::Attribute::Association.should have_received(:new).with(association_name, factory_name, :name => "John Doe")
|
185
|
+
end
|
186
|
+
|
187
|
+
it "defines an association attribute when the association is called implicitly" do
|
188
|
+
subject.send(association_name, options)
|
189
|
+
|
190
|
+
factory.should have_received(:define_attribute).with(attribute)
|
191
|
+
FactoryGirl::Attribute::Association.should have_received(:new).with(association_name, factory_name, :name => "John Doe")
|
192
|
+
end
|
127
193
|
end
|
128
194
|
|
129
|
-
|
130
|
-
name
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
it "adds an association when passed an undefined method with a hash including :factory key" do
|
139
|
-
name = :author
|
140
|
-
factory_name = :user
|
141
|
-
overrides = { :first_name => 'Ben' }
|
142
|
-
args = { :factory => factory_name }.merge(overrides)
|
143
|
-
attr = 'attribute'
|
144
|
-
stub(attr).name { name }
|
145
|
-
mock(FactoryGirl::Attribute::Association).new(name, factory_name, overrides) { attr }
|
146
|
-
subject.send(name, args)
|
147
|
-
factory.attributes.should include(attr)
|
148
|
-
end
|
149
|
-
|
150
|
-
it "delegates to_create" do
|
151
|
-
result = 'expected'
|
152
|
-
mock(factory).to_create { result }
|
153
|
-
|
154
|
-
subject.to_create.should == result
|
195
|
+
context "without a factory set in the hash" do
|
196
|
+
let(:options) { { :name => "Jane Doe" } }
|
197
|
+
|
198
|
+
it "defines an association attribute with the association name" do
|
199
|
+
subject.association(association_name, options)
|
200
|
+
|
201
|
+
factory.should have_received(:define_attribute).with(attribute)
|
202
|
+
FactoryGirl::Attribute::Association.should have_received(:new).with(association_name, association_name, options)
|
203
|
+
end
|
155
204
|
end
|
156
205
|
end
|
@@ -1,66 +1,45 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "accessing an undefined method on Factory that is defined on FactoryGirl" do
|
4
|
-
let(:method_name)
|
4
|
+
let(:method_name) { :aliases }
|
5
5
|
let(:return_value) { 'value' }
|
6
|
-
let(:args)
|
6
|
+
let(:args) { [1, 2, 3] }
|
7
7
|
|
8
8
|
before do
|
9
|
-
|
10
|
-
stub(FactoryGirl, method_name).returns { return_value }
|
11
|
-
|
12
|
-
@result = Factory.send(method_name, *args)
|
9
|
+
FactoryGirl.stubs(method_name => return_value)
|
13
10
|
end
|
14
11
|
|
12
|
+
subject { Factory.send(method_name, *args) }
|
13
|
+
|
15
14
|
it "prints a deprecation warning" do
|
16
|
-
$stderr.
|
15
|
+
$stderr.stubs(:puts)
|
16
|
+
subject
|
17
|
+
$stderr.should have_received(:puts).with(anything)
|
17
18
|
end
|
18
19
|
|
19
20
|
it "invokes that method on FactoryGirl" do
|
20
|
-
|
21
|
+
subject
|
22
|
+
FactoryGirl.should have_received(method_name).with(*args)
|
21
23
|
end
|
22
24
|
|
23
25
|
it "returns the value from the method on FactoryGirl" do
|
24
|
-
|
26
|
+
subject.should == return_value
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
28
30
|
describe "accessing an undefined method on Factory that is not defined on FactoryGirl" do
|
29
|
-
let(:method_name) { :magic_beans }
|
30
|
-
|
31
|
-
before do
|
32
|
-
stub($stderr).puts { raise "Don't print a deprecation warning" }
|
33
|
-
|
34
|
-
begin
|
35
|
-
Factory.send(method_name)
|
36
|
-
rescue Exception => @raised
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
31
|
it "raises a NoMethodError" do
|
41
|
-
|
32
|
+
expect { Factory.send(:magic_beans) }.to raise_error(NoMethodError)
|
42
33
|
end
|
43
34
|
end
|
44
35
|
|
45
36
|
describe "accessing an undefined constant on Factory that is defined on FactoryGirl" do
|
46
|
-
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
it "returns that constant on FactoryGirl" do
|
51
|
-
@result.should == FactoryGirl::VERSION
|
52
|
-
end
|
37
|
+
subject { Factory::VERSION }
|
38
|
+
it { should == FactoryGirl::VERSION }
|
53
39
|
end
|
54
40
|
|
55
41
|
describe "accessing an undefined constant on Factory that is undefined on FactoryGirl" do
|
56
42
|
it "raises a NameError for Factory" do
|
57
|
-
|
58
|
-
Factory::BOGUS
|
59
|
-
rescue Exception => exception
|
60
|
-
end
|
61
|
-
|
62
|
-
exception.should be_a(NameError)
|
63
|
-
exception.message.should include("Factory::BOGUS")
|
43
|
+
expect { Factory::BOGUS }.to raise_error(NameError, /Factory::BOGUS/)
|
64
44
|
end
|
65
45
|
end
|
66
|
-
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe FactoryGirl::Factory do
|
4
|
-
include DefinesConstants
|
5
|
-
|
6
4
|
before do
|
7
5
|
@name = :user
|
8
6
|
@class = define_class('User')
|
@@ -25,48 +23,16 @@ describe FactoryGirl::Factory do
|
|
25
23
|
@factory.default_strategy.should == :create
|
26
24
|
end
|
27
25
|
|
28
|
-
describe "after adding an attribute" do
|
29
|
-
before do
|
30
|
-
@attribute = "attribute"
|
31
|
-
@proxy = "proxy"
|
32
|
-
|
33
|
-
stub(@attribute).name { :name }
|
34
|
-
stub(@attribute).add_to
|
35
|
-
stub(@proxy).set
|
36
|
-
stub(@proxy).result { 'result' }
|
37
|
-
stub(FactoryGirl::Attribute::Static).new { @attribute }
|
38
|
-
stub(FactoryGirl::Proxy::Build).new { @proxy }
|
39
|
-
|
40
|
-
@factory.define_attribute(@attribute)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should create the right proxy using the build class when running" do
|
44
|
-
mock(FactoryGirl::Proxy::Build).new(@factory.build_class) { @proxy }
|
45
|
-
@factory.run(FactoryGirl::Proxy::Build, {})
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should add the attribute to the proxy when running" do
|
49
|
-
mock(@attribute).add_to(@proxy)
|
50
|
-
@factory.run(FactoryGirl::Proxy::Build, {})
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should return the result from the proxy when running" do
|
54
|
-
mock(@proxy).result(nil) { 'result' }
|
55
|
-
@factory.run(FactoryGirl::Proxy::Build, {}).should == 'result'
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
26
|
it "passes a custom creation block" do
|
60
|
-
proxy =
|
61
|
-
|
62
|
-
stub(proxy).result {}
|
27
|
+
proxy = stub("proxy", :result => nil)
|
28
|
+
FactoryGirl::Proxy::Build.stubs(:new => proxy)
|
63
29
|
block = lambda {}
|
64
30
|
factory = FactoryGirl::Factory.new(:object)
|
65
31
|
factory.to_create(&block)
|
66
32
|
|
67
33
|
factory.run(FactoryGirl::Proxy::Build, {})
|
68
34
|
|
69
|
-
proxy.should have_received.
|
35
|
+
proxy.should have_received(:result).with(block)
|
70
36
|
end
|
71
37
|
|
72
38
|
it "should return associations" do
|
@@ -202,169 +168,174 @@ describe FactoryGirl::Factory do
|
|
202
168
|
end
|
203
169
|
|
204
170
|
describe FactoryGirl::Factory, "when defined with a custom class" do
|
205
|
-
|
206
|
-
|
207
|
-
@factory = FactoryGirl::Factory.new(:author, :class => @class)
|
208
|
-
end
|
209
|
-
|
210
|
-
it "should use the specified class as the build class" do
|
211
|
-
@factory.build_class.should == @class
|
212
|
-
end
|
171
|
+
subject { FactoryGirl::Factory.new(:author, :class => Float) }
|
172
|
+
its(:build_class) { should == Float }
|
213
173
|
end
|
214
174
|
|
215
175
|
describe FactoryGirl::Factory, "when defined with a class instead of a name" do
|
216
|
-
|
217
|
-
|
218
|
-
@name = :argument_error
|
219
|
-
@factory = FactoryGirl::Factory.new(@class)
|
220
|
-
end
|
176
|
+
let(:factory_class) { ArgumentError }
|
177
|
+
let(:name) { :argument_error }
|
221
178
|
|
222
|
-
|
223
|
-
@factory.name.should == @name
|
224
|
-
end
|
179
|
+
subject { FactoryGirl::Factory.new(factory_class) }
|
225
180
|
|
226
|
-
|
227
|
-
|
228
|
-
end
|
181
|
+
its(:name) { should == name }
|
182
|
+
its(:build_class) { should == factory_class }
|
229
183
|
end
|
230
184
|
|
231
185
|
describe FactoryGirl::Factory, "when defined with a custom class name" do
|
232
|
-
|
233
|
-
|
234
|
-
@factory = FactoryGirl::Factory.new(:author, :class => :argument_error)
|
235
|
-
end
|
236
|
-
|
237
|
-
it "should use the specified class as the build class" do
|
238
|
-
@factory.build_class.should == @class
|
239
|
-
end
|
186
|
+
subject { FactoryGirl::Factory.new(:author, :class => :argument_error) }
|
187
|
+
its(:build_class) { should == ArgumentError }
|
240
188
|
end
|
241
189
|
|
242
190
|
describe FactoryGirl::Factory, "with a name ending in s" do
|
243
|
-
|
244
|
-
|
245
|
-
before do
|
246
|
-
define_class('Business')
|
247
|
-
@name = :business
|
248
|
-
@class = Business
|
249
|
-
@factory = FactoryGirl::Factory.new(@name)
|
250
|
-
end
|
191
|
+
let(:name) { :business }
|
192
|
+
let(:business_class) { Business }
|
251
193
|
|
252
|
-
|
253
|
-
|
254
|
-
end
|
194
|
+
before { define_class('Business') }
|
195
|
+
subject { FactoryGirl::Factory.new(name) }
|
255
196
|
|
256
|
-
|
257
|
-
|
258
|
-
end
|
197
|
+
its(:name) { should == name }
|
198
|
+
its(:build_class) { should == business_class }
|
259
199
|
end
|
260
200
|
|
261
201
|
describe FactoryGirl::Factory, "with a string for a name" do
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
end
|
266
|
-
|
267
|
-
it "should convert the string to a symbol" do
|
268
|
-
@factory.name.should == @name
|
269
|
-
end
|
202
|
+
let(:name) { :string }
|
203
|
+
subject { FactoryGirl::Factory.new(name.to_s) }
|
204
|
+
its(:name) { should == name }
|
270
205
|
end
|
271
206
|
|
272
207
|
describe FactoryGirl::Factory, "for namespaced class" do
|
273
|
-
|
208
|
+
let(:name) { :settings }
|
209
|
+
let(:settings_class) { Admin::Settings }
|
274
210
|
|
275
211
|
before do
|
276
|
-
define_class(
|
277
|
-
define_class(
|
278
|
-
|
279
|
-
@name = :settings
|
280
|
-
@class = Admin::Settings
|
212
|
+
define_class("Admin")
|
213
|
+
define_class("Admin::Settings")
|
281
214
|
end
|
282
215
|
|
283
|
-
|
284
|
-
|
285
|
-
|
216
|
+
context "with a namespaced class with Namespace::Class syntax" do
|
217
|
+
subject { FactoryGirl::Factory.new(name, :class => "Admin::Settings") }
|
218
|
+
|
219
|
+
it "sets build_class correctly" do
|
220
|
+
subject.build_class.should == settings_class
|
221
|
+
end
|
286
222
|
end
|
287
223
|
|
288
|
-
|
289
|
-
|
290
|
-
|
224
|
+
context "with a namespaced class with namespace/class syntax" do
|
225
|
+
subject { FactoryGirl::Factory.new(name, :class => "admin/settings") }
|
226
|
+
|
227
|
+
it "sets build_class correctly" do
|
228
|
+
subject.build_class.should == settings_class
|
229
|
+
end
|
291
230
|
end
|
292
231
|
end
|
293
232
|
|
294
233
|
describe FactoryGirl::Factory do
|
295
|
-
|
234
|
+
let(:factory_with_non_existent_strategy) do
|
235
|
+
FactoryGirl::Factory.new(:object, :default_strategy => :nonexistent) { }
|
236
|
+
end
|
237
|
+
|
238
|
+
let(:factory_with_stub_strategy) do
|
239
|
+
FactoryGirl::Factory.new(:object, :default_strategy => :stub)
|
240
|
+
end
|
241
|
+
|
242
|
+
let(:factory_without_strategy) do
|
243
|
+
FactoryGirl::Factory.new(:other_object)
|
244
|
+
end
|
245
|
+
|
246
|
+
let(:factory_with_build_strategy) do
|
247
|
+
FactoryGirl::Factory.new(:other_object, :default_strategy => :build)
|
248
|
+
end
|
296
249
|
|
297
250
|
before do
|
298
|
-
define_class(
|
299
|
-
define_class(
|
251
|
+
define_class("User")
|
252
|
+
define_class("Admin", User)
|
300
253
|
end
|
301
254
|
|
302
|
-
it "
|
303
|
-
|
304
|
-
FactoryGirl::Factory.new(:object, :default_strategy => :nonexistent) {}
|
305
|
-
}.should raise_error(ArgumentError)
|
255
|
+
it "raises an ArgumentError when trying to use a non-existent strategy" do
|
256
|
+
expect { factory_with_non_existent_strategy }.to raise_error(ArgumentError)
|
306
257
|
end
|
307
258
|
|
308
|
-
it "
|
309
|
-
|
310
|
-
factory.default_strategy.should == :stub
|
259
|
+
it "creates a new factory with a specified default strategy" do
|
260
|
+
factory_with_stub_strategy.default_strategy.should == :stub
|
311
261
|
end
|
312
262
|
|
313
|
-
describe
|
263
|
+
describe "defining a child factory without setting default strategy" do
|
264
|
+
let(:parent) { factory_with_stub_strategy }
|
265
|
+
subject { factory_without_strategy }
|
266
|
+
|
314
267
|
before do
|
315
|
-
|
316
|
-
@child = FactoryGirl::Factory.new(:child_object)
|
317
|
-
@child.inherit_from(@parent)
|
268
|
+
subject.inherit_from(parent)
|
318
269
|
end
|
319
270
|
|
320
|
-
it "
|
321
|
-
|
271
|
+
it "inherits default strategy from its parent" do
|
272
|
+
subject.default_strategy.should == :stub
|
322
273
|
end
|
323
274
|
end
|
324
275
|
|
325
|
-
describe
|
276
|
+
describe "defining a child factory with a default strategy" do
|
277
|
+
let(:parent) { factory_with_stub_strategy }
|
278
|
+
subject { factory_with_build_strategy }
|
279
|
+
|
326
280
|
before do
|
327
|
-
|
328
|
-
@child = FactoryGirl::Factory.new(:child_object2, :default_strategy => :build)
|
329
|
-
@child.inherit_from(@parent)
|
281
|
+
subject.inherit_from(parent)
|
330
282
|
end
|
331
283
|
|
332
|
-
it "
|
333
|
-
|
284
|
+
it "overrides the default strategy from parent" do
|
285
|
+
subject.default_strategy.should == :build
|
334
286
|
end
|
335
287
|
end
|
336
|
-
|
337
288
|
end
|
338
289
|
|
339
290
|
describe FactoryGirl::Factory, "human names" do
|
340
291
|
context "factory name without underscores" do
|
341
|
-
subject { FactoryGirl::Factory.new(
|
292
|
+
subject { FactoryGirl::Factory.new(:user) }
|
293
|
+
its(:names) { should == [:user] }
|
342
294
|
its(:human_names) { should == ["user"] }
|
343
295
|
end
|
344
296
|
|
345
297
|
context "factory name with underscores" do
|
346
|
-
subject { FactoryGirl::Factory.new(
|
298
|
+
subject { FactoryGirl::Factory.new(:happy_user) }
|
299
|
+
its(:names) { should == [:happy_user] }
|
347
300
|
its(:human_names) { should == ["happy user"] }
|
348
301
|
end
|
349
302
|
|
350
303
|
context "factory name with aliases" do
|
351
|
-
subject { FactoryGirl::Factory.new(
|
304
|
+
subject { FactoryGirl::Factory.new(:happy_user, :aliases => [:gleeful_user, :person]) }
|
305
|
+
its(:names) { should == [:happy_user, :gleeful_user, :person] }
|
352
306
|
its(:human_names) { should == ["happy user", "gleeful user", "person"] }
|
353
307
|
end
|
354
308
|
end
|
355
309
|
|
356
|
-
describe FactoryGirl::Factory, "
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
310
|
+
describe FactoryGirl::Factory, "running a factory" do
|
311
|
+
subject { FactoryGirl::Factory.new(:user) }
|
312
|
+
let(:attribute) { stub("attribute", :name => :name, :ignored => false, :add_to => nil, :aliases_for? => true) }
|
313
|
+
let(:proxy) { stub("proxy", :result => "result", :set => nil) }
|
314
|
+
|
315
|
+
before do
|
316
|
+
define_model("User", :name => :string)
|
317
|
+
FactoryGirl::Attribute::Static.stubs(:new => attribute)
|
318
|
+
FactoryGirl::Proxy::Build.stubs(:new => proxy)
|
319
|
+
FactoryGirl::AttributeList.stubs(:new => [attribute])
|
320
|
+
end
|
321
|
+
|
322
|
+
it "creates the right proxy using the build class when running" do
|
323
|
+
subject.run(FactoryGirl::Proxy::Build, {})
|
324
|
+
FactoryGirl::Proxy::Build.should have_received(:new).with(subject.build_class)
|
325
|
+
end
|
326
|
+
|
327
|
+
it "adds the attribute to the proxy when running" do
|
328
|
+
subject.run(FactoryGirl::Proxy::Build, {})
|
329
|
+
attribute.should have_received(:add_to).with(proxy)
|
330
|
+
end
|
331
|
+
|
332
|
+
it "returns the result from the proxy when running" do
|
333
|
+
subject.run(FactoryGirl::Proxy::Build, {}).should == "result"
|
334
|
+
proxy.should have_received(:result).with(nil)
|
362
335
|
end
|
363
336
|
|
364
|
-
it "
|
365
|
-
name
|
366
|
-
|
367
|
-
factory = FactoryGirl::Factory.new(:user, :aliases => [aliased_name])
|
368
|
-
factory.human_names.should =~ [name.to_s, aliased_name.to_s]
|
337
|
+
it "sets overrides once on the factory" do
|
338
|
+
subject.run(FactoryGirl::Proxy::Build, { :name => "John Doe" })
|
339
|
+
proxy.should have_received(:set).once
|
369
340
|
end
|
370
341
|
end
|