factory_girl 2.0.0.beta2 → 2.0.0.beta3
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/Appraisals +1 -0
- data/CONTRIBUTION_GUIDELINES.md +7 -7
- data/GETTING_STARTED.md +36 -11
- data/Gemfile +2 -2
- data/Gemfile.lock +28 -21
- data/README.md +2 -2
- data/Rakefile +2 -2
- data/features/factory_girl_steps.feature +33 -0
- data/features/support/factories.rb +25 -18
- data/features/support/test.db +0 -0
- data/lib/factory_girl.rb +27 -0
- data/lib/factory_girl/attribute.rb +4 -0
- data/lib/factory_girl/attribute/association.rb +4 -0
- data/lib/factory_girl/attribute/dynamic.rb +1 -1
- data/lib/factory_girl/attribute/implicit.rb +36 -0
- data/lib/factory_girl/attribute/sequence.rb +16 -0
- data/lib/factory_girl/definition_proxy.rb +2 -2
- data/lib/factory_girl/factory.rb +1 -13
- data/lib/factory_girl/find_definitions.rb +1 -3
- data/lib/factory_girl/proxy/build.rb +2 -2
- data/lib/factory_girl/proxy/stub.rb +6 -2
- data/lib/factory_girl/rails2.rb +7 -1
- data/lib/factory_girl/registry.rb +7 -21
- data/lib/factory_girl/sequence.rb +3 -14
- data/lib/factory_girl/step_definitions.rb +5 -5
- data/lib/factory_girl/syntax/blueprint.rb +1 -1
- data/lib/factory_girl/syntax/default.rb +3 -3
- data/lib/factory_girl/syntax/generate.rb +3 -3
- data/lib/factory_girl/syntax/make.rb +5 -1
- data/lib/factory_girl/syntax/methods.rb +51 -4
- data/lib/factory_girl/syntax/sham.rb +2 -2
- data/lib/factory_girl/syntax/vintage.rb +31 -12
- data/lib/factory_girl/version.rb +1 -1
- data/spec/acceptance/build_list_spec.rb +42 -0
- data/spec/acceptance/create_list_spec.rb +42 -0
- data/spec/acceptance/sequence_spec.rb +6 -4
- data/spec/acceptance/syntax/blueprint_spec.rb +3 -3
- data/spec/acceptance/syntax/make_spec.rb +19 -1
- data/spec/acceptance/syntax/vintage_spec.rb +4 -4
- data/spec/factory_girl/attribute/association_spec.rb +4 -0
- data/spec/factory_girl/attribute/implicit_spec.rb +50 -0
- data/spec/factory_girl/attribute/sequence_spec.rb +21 -0
- data/spec/factory_girl/attribute_spec.rb +4 -0
- data/spec/factory_girl/definition_proxy_spec.rb +2 -13
- data/spec/factory_girl/factory_spec.rb +4 -2
- data/spec/factory_girl/find_definitions_spec.rb +9 -0
- data/spec/factory_girl/proxy/build_spec.rb +2 -2
- data/spec/factory_girl/proxy/create_spec.rb +2 -2
- data/spec/factory_girl/proxy/stub_spec.rb +5 -1
- data/spec/factory_girl/registry_spec.rb +11 -20
- data/spec/factory_girl/sequence_spec.rb +15 -19
- data/spec/factory_girl_spec.rb +17 -0
- data/spec/spec_helper.rb +2 -1
- metadata +45 -73
data/lib/factory_girl/version.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'acceptance/acceptance_helper'
|
3
|
+
|
4
|
+
describe "build multiple instances" do
|
5
|
+
before do
|
6
|
+
define_model('Post', :title => :string)
|
7
|
+
|
8
|
+
FactoryGirl.define do
|
9
|
+
factory(:post) do |post|
|
10
|
+
post.title "Through the Looking Glass"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "without default attributes" do
|
16
|
+
subject { FactoryGirl.build_list(:post, 20) }
|
17
|
+
|
18
|
+
its(:length) { should == 20 }
|
19
|
+
|
20
|
+
it "builds (but doesn't save) all the posts" do
|
21
|
+
subject.each do |record|
|
22
|
+
record.should be_new_record
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "uses the default factory values" do
|
27
|
+
subject.each do |record|
|
28
|
+
record.title.should == "Through the Looking Glass"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "with default attributes" do
|
34
|
+
subject { FactoryGirl.build_list(:post, 20, :title => "The Hunting of the Snark") }
|
35
|
+
|
36
|
+
it "overrides the default values" do
|
37
|
+
subject.each do |record|
|
38
|
+
record.title.should == "The Hunting of the Snark"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'acceptance/acceptance_helper'
|
3
|
+
|
4
|
+
describe "create multiple instances" do
|
5
|
+
before do
|
6
|
+
define_model('Post', :title => :string)
|
7
|
+
|
8
|
+
FactoryGirl.define do
|
9
|
+
factory(:post) do |post|
|
10
|
+
post.title "Through the Looking Glass"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "without default attributes" do
|
16
|
+
subject { FactoryGirl.create_list(:post, 20) }
|
17
|
+
|
18
|
+
its(:length) { should == 20 }
|
19
|
+
|
20
|
+
it "creates all the posts" do
|
21
|
+
subject.each do |record|
|
22
|
+
record.should_not be_new_record
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "uses the default factory values" do
|
27
|
+
subject.each do |record|
|
28
|
+
record.title.should == "Through the Looking Glass"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "with default attributes" do
|
34
|
+
subject { FactoryGirl.create_list(:post, 20, :title => "The Hunting of the Snark") }
|
35
|
+
|
36
|
+
it "overrides the default values" do
|
37
|
+
subject.each do |record|
|
38
|
+
record.title.should == "The Hunting of the Snark"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -2,6 +2,8 @@ require 'spec_helper'
|
|
2
2
|
require 'acceptance/acceptance_helper'
|
3
3
|
|
4
4
|
describe "sequences" do
|
5
|
+
include FactoryGirl::Syntax::Methods
|
6
|
+
|
5
7
|
it "generates several values in the correct format" do
|
6
8
|
FactoryGirl.define do
|
7
9
|
sequence :email do |n|
|
@@ -9,8 +11,8 @@ describe "sequences" do
|
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
|
-
first_value =
|
13
|
-
another_value =
|
14
|
+
first_value = generate(:email)
|
15
|
+
another_value = generate(:email)
|
14
16
|
|
15
17
|
first_value.should =~ /^somebody\d+@example\.com$/
|
16
18
|
another_value.should =~ /^somebody\d+@example\.com$/
|
@@ -22,8 +24,8 @@ describe "sequences" do
|
|
22
24
|
sequence :order
|
23
25
|
end
|
24
26
|
|
25
|
-
first_value =
|
26
|
-
another_value =
|
27
|
+
first_value = generate(:order)
|
28
|
+
another_value = generate(:order)
|
27
29
|
|
28
30
|
first_value.should == 1
|
29
31
|
another_value.should == 2
|
@@ -9,9 +9,9 @@ describe "a blueprint" do
|
|
9
9
|
|
10
10
|
Factory.sequence(:email) { |n| "somebody#{n}@example.com" }
|
11
11
|
User.blueprint do
|
12
|
-
first_name { 'Bill'
|
13
|
-
last_name { 'Nye'
|
14
|
-
email { FactoryGirl.
|
12
|
+
first_name { 'Bill' }
|
13
|
+
last_name { 'Nye' }
|
14
|
+
email { FactoryGirl.generate(:email) }
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -15,7 +15,7 @@ describe "a factory using make syntax" do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
describe "after
|
18
|
+
describe "after make" do
|
19
19
|
before do
|
20
20
|
@instance = User.make(:last_name => 'Rye')
|
21
21
|
end
|
@@ -28,6 +28,24 @@ describe "a factory using make syntax" do
|
|
28
28
|
@instance.last_name.should == 'Rye'
|
29
29
|
end
|
30
30
|
|
31
|
+
it "should build the record" do
|
32
|
+
@instance.should be_new_record
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "after make!" do
|
37
|
+
before do
|
38
|
+
@instance = User.make!(:last_name => 'Rye')
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should use attributes from the factory" do
|
42
|
+
@instance.first_name.should == 'Bill'
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should use attributes passed to make" do
|
46
|
+
@instance.last_name.should == 'Rye'
|
47
|
+
end
|
48
|
+
|
31
49
|
it "should save the record" do
|
32
50
|
@instance.should_not be_new_record
|
33
51
|
end
|
@@ -11,7 +11,7 @@ describe "vintage syntax" do
|
|
11
11
|
Factory.define :user do |factory|
|
12
12
|
factory.first_name { 'Bill' }
|
13
13
|
factory.last_name { 'Nye' }
|
14
|
-
factory.email { Factory(:email) }
|
14
|
+
factory.email { Factory.next(:email) }
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -51,7 +51,7 @@ describe Factory, "given a parent factory" do
|
|
51
51
|
before do
|
52
52
|
@parent = FactoryGirl::Factory.new(:object)
|
53
53
|
@parent.define_attribute(FactoryGirl::Attribute::Static.new(:name, 'value'))
|
54
|
-
FactoryGirl.
|
54
|
+
FactoryGirl.register_factory(@parent)
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should raise an ArgumentError when trying to use a non-existent factory as parent" do
|
@@ -87,7 +87,7 @@ describe "defining a factory" do
|
|
87
87
|
|
88
88
|
it "should add the factory to the list of factories" do
|
89
89
|
Factory.define(@name) {|f| }
|
90
|
-
@factory.should == FactoryGirl.
|
90
|
+
@factory.should == FactoryGirl.factory_by_name(@name)
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -96,7 +96,7 @@ describe "after defining a factory" do
|
|
96
96
|
@name = :user
|
97
97
|
@factory = FactoryGirl::Factory.new(@name)
|
98
98
|
|
99
|
-
FactoryGirl.
|
99
|
+
FactoryGirl.register_factory(@factory)
|
100
100
|
end
|
101
101
|
|
102
102
|
it "should use Proxy::AttributesFor for Factory.attributes_for" do
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FactoryGirl::Attribute::Implicit do
|
4
|
+
before do
|
5
|
+
@name = :author
|
6
|
+
@attr = FactoryGirl::Attribute::Implicit.new(@name)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "has a name" do
|
10
|
+
@attr.name.should == @name
|
11
|
+
end
|
12
|
+
|
13
|
+
context "with a known factory" do
|
14
|
+
before do
|
15
|
+
stub(FactoryGirl.factories).registered? { true }
|
16
|
+
end
|
17
|
+
|
18
|
+
it "associates the factory" do
|
19
|
+
proxy = "proxy"
|
20
|
+
stub(proxy).associate
|
21
|
+
@attr.add_to(proxy)
|
22
|
+
proxy.should have_received.associate(@name, @name, {})
|
23
|
+
end
|
24
|
+
|
25
|
+
it "is an association" do
|
26
|
+
@attr.should be_association
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has a factory" do
|
30
|
+
@attr.factory.should == @name
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context "with a known sequence" do
|
35
|
+
before do
|
36
|
+
FactoryGirl.register_sequence(FactoryGirl::Sequence.new(@name, 1) { "magic" })
|
37
|
+
end
|
38
|
+
|
39
|
+
it "generates the sequence" do
|
40
|
+
proxy = "proxy"
|
41
|
+
stub(proxy).set
|
42
|
+
@attr.add_to(proxy)
|
43
|
+
proxy.should have_received.set(@name, "magic")
|
44
|
+
end
|
45
|
+
|
46
|
+
it "isn't an association" do
|
47
|
+
@attr.should_not be_association
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FactoryGirl::Attribute::Sequence do
|
4
|
+
before do
|
5
|
+
@name = :first_name
|
6
|
+
@sequence = :name
|
7
|
+
FactoryGirl.register_sequence(FactoryGirl::Sequence.new(@sequence, 5) { |n| "Name #{n}" })
|
8
|
+
@attr = FactoryGirl::Attribute::Sequence.new(@name, @sequence)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should have a name" do
|
12
|
+
@attr.name.should == @name
|
13
|
+
end
|
14
|
+
|
15
|
+
it "assigns the next value in the sequence" do
|
16
|
+
proxy = "proxy"
|
17
|
+
stub(proxy).set
|
18
|
+
@attr.add_to(proxy)
|
19
|
+
proxy.should have_received.set(@name, "Name 5")
|
20
|
+
end
|
21
|
+
end
|
@@ -111,22 +111,11 @@ describe FactoryGirl::DefinitionProxy do
|
|
111
111
|
factory.attributes.should include(attribute)
|
112
112
|
end
|
113
113
|
|
114
|
-
it "adds an
|
114
|
+
it "adds an implicit attribute when passed an undefined method without arguments or a block" do
|
115
115
|
name = :user
|
116
|
-
FactoryGirl.register(FactoryGirl::Factory.new(name))
|
117
116
|
attr = 'attribute'
|
118
117
|
stub(attr).name { name }
|
119
|
-
mock(FactoryGirl::Attribute::
|
120
|
-
subject.send(name)
|
121
|
-
factory.attributes.should include(attr)
|
122
|
-
end
|
123
|
-
|
124
|
-
it "adds a sequence when passed an undefined method without arguments or a block" do
|
125
|
-
name = :airport
|
126
|
-
FactoryGirl.register(FactoryGirl::Sequence.new(name))
|
127
|
-
attr = 'attribute'
|
128
|
-
stub(attr).name { name }
|
129
|
-
mock(FactoryGirl::Attribute::Association).new(name, name, {}) { attr }
|
118
|
+
mock(FactoryGirl::Attribute::Implicit).new(name) { attr }
|
130
119
|
subject.send(name)
|
131
120
|
factory.attributes.should include(attr)
|
132
121
|
end
|
@@ -89,12 +89,14 @@ describe FactoryGirl::Factory do
|
|
89
89
|
|
90
90
|
it "should return associations" do
|
91
91
|
factory = FactoryGirl::Factory.new(:post)
|
92
|
+
FactoryGirl.register_factory(FactoryGirl::Factory.new(:admin))
|
92
93
|
factory.define_attribute(FactoryGirl::Attribute::Association.new(:author, :author, {}))
|
93
94
|
factory.define_attribute(FactoryGirl::Attribute::Association.new(:editor, :editor, {}))
|
95
|
+
factory.define_attribute(FactoryGirl::Attribute::Implicit.new(:admin))
|
94
96
|
factory.associations.each do |association|
|
95
|
-
association.should
|
97
|
+
association.should be_association
|
96
98
|
end
|
97
|
-
factory.associations.size.should ==
|
99
|
+
factory.associations.size.should == 3
|
98
100
|
end
|
99
101
|
|
100
102
|
it "should raise for a self referencing association" do
|
@@ -96,5 +96,14 @@ describe "definition loading" do
|
|
96
96
|
it { should require_definitions_from("#{dir}/factories/person_factory.rb") }
|
97
97
|
end
|
98
98
|
end
|
99
|
+
|
100
|
+
describe "with deeply nested factory files under #{dir}" do
|
101
|
+
in_directory_with_files File.join(dir, 'factories', 'subdirectory', 'post_factory.rb'),
|
102
|
+
File.join(dir, 'factories', 'subdirectory', 'person_factory.rb')
|
103
|
+
it_should_behave_like "finds definitions" do
|
104
|
+
it { should require_definitions_from("#{dir}/factories/subdirectory/post_factory.rb") }
|
105
|
+
it { should require_definitions_from("#{dir}/factories/subdirectory/person_factory.rb") }
|
106
|
+
end
|
107
|
+
end
|
99
108
|
end
|
100
109
|
end
|
@@ -21,7 +21,7 @@ describe FactoryGirl::Proxy::Build do
|
|
21
21
|
before do
|
22
22
|
@association = "associated-instance"
|
23
23
|
@associated_factory = "associated-factory"
|
24
|
-
stub(FactoryGirl).
|
24
|
+
stub(FactoryGirl).factory_by_name { @associated_factory }
|
25
25
|
stub(@associated_factory).run { @association }
|
26
26
|
@overrides = { 'attr' => 'value' }
|
27
27
|
@proxy.associate(:owner, :user, @overrides)
|
@@ -39,7 +39,7 @@ describe FactoryGirl::Proxy::Build do
|
|
39
39
|
it "should run create when building an association" do
|
40
40
|
association = "associated-instance"
|
41
41
|
associated_factory = "associated-factory"
|
42
|
-
stub(FactoryGirl).
|
42
|
+
stub(FactoryGirl).factory_by_name { associated_factory }
|
43
43
|
stub(associated_factory).run { association }
|
44
44
|
overrides = { 'attr' => 'value' }
|
45
45
|
@proxy.association(:user, overrides).should == association
|
@@ -22,7 +22,7 @@ describe FactoryGirl::Proxy::Create do
|
|
22
22
|
before do
|
23
23
|
@association = "associated-instance"
|
24
24
|
@associated_factory = "associated-factory"
|
25
|
-
stub(FactoryGirl).
|
25
|
+
stub(FactoryGirl).factory_by_name { @associated_factory }
|
26
26
|
stub(@associated_factory).run { @association }
|
27
27
|
@overrides = { 'attr' => 'value' }
|
28
28
|
@proxy.associate(:owner, :user, @overrides)
|
@@ -40,7 +40,7 @@ describe FactoryGirl::Proxy::Create do
|
|
40
40
|
it "should run create when building an association" do
|
41
41
|
association = "associated-instance"
|
42
42
|
associated_factory = "associated-factory"
|
43
|
-
stub(FactoryGirl).
|
43
|
+
stub(FactoryGirl).factory_by_name { associated_factory }
|
44
44
|
stub(associated_factory).run { association }
|
45
45
|
overrides = { 'attr' => 'value' }
|
46
46
|
@proxy.association(:user, overrides).should == association
|
@@ -16,6 +16,10 @@ describe FactoryGirl::Proxy::Stub do
|
|
16
16
|
@stub.result(nil).should_not be_new_record
|
17
17
|
end
|
18
18
|
|
19
|
+
it "should be persisted" do
|
20
|
+
@stub.result(nil).should be_persisted
|
21
|
+
end
|
22
|
+
|
19
23
|
it "should not be able to connect to the database" do
|
20
24
|
lambda { @stub.result(nil).reload }.should raise_error(RuntimeError)
|
21
25
|
end
|
@@ -23,7 +27,7 @@ describe FactoryGirl::Proxy::Stub do
|
|
23
27
|
describe "when a user factory exists" do
|
24
28
|
before do
|
25
29
|
@user = "user"
|
26
|
-
stub(FactoryGirl).
|
30
|
+
stub(FactoryGirl).factory_by_name { @associated_factory }
|
27
31
|
@associated_factory = 'associate-factory'
|
28
32
|
end
|
29
33
|
|
@@ -41,14 +41,13 @@ describe FactoryGirl::Registry do
|
|
41
41
|
other_factory = FactoryGirl::Factory.new(:string)
|
42
42
|
subject.add(factory)
|
43
43
|
subject.add(other_factory)
|
44
|
-
result =
|
44
|
+
result = []
|
45
45
|
|
46
|
-
subject.each do |
|
47
|
-
result
|
46
|
+
subject.each do |value|
|
47
|
+
result << value
|
48
48
|
end
|
49
49
|
|
50
|
-
result.should
|
51
|
-
other_factory.name => other_factory }
|
50
|
+
result.should =~ [factory, other_factory]
|
52
51
|
end
|
53
52
|
|
54
53
|
it "registers an sequence" do
|
@@ -71,22 +70,14 @@ describe FactoryGirl::Registry do
|
|
71
70
|
end
|
72
71
|
end
|
73
72
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
FactoryGirl.find(factory.name).should == factory
|
78
|
-
end
|
79
|
-
|
80
|
-
it "knows that a factory is registered by symbol" do
|
81
|
-
FactoryGirl.register(factory)
|
82
|
-
FactoryGirl.should be_registered(factory.name.to_sym)
|
83
|
-
end
|
73
|
+
it "is enumerable" do
|
74
|
+
should be_kind_of(Enumerable)
|
75
|
+
end
|
84
76
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
77
|
+
it "clears registered factories" do
|
78
|
+
subject.add(factory)
|
79
|
+
subject.clear
|
80
|
+
subject.count.should == 0
|
90
81
|
end
|
91
82
|
end
|
92
83
|
|