factory_girl 3.0.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/GETTING_STARTED.md +77 -52
- data/Gemfile.lock +10 -10
- data/{Changelog → NEWS} +7 -0
- data/README.md +7 -0
- data/factory_girl.gemspec +2 -2
- data/features/factory_girl_steps.feature +4 -0
- data/features/step_definitions/factory_girl_steps.rb +3 -3
- data/features/support/factories.rb +20 -0
- data/gemfiles/3.0.gemfile.lock +51 -48
- data/gemfiles/3.1.gemfile.lock +45 -51
- data/gemfiles/3.2.gemfile.lock +38 -42
- data/lib/factory_girl.rb +1 -1
- data/lib/factory_girl/definition_proxy.rb +2 -2
- data/lib/factory_girl/evaluator.rb +1 -2
- data/lib/factory_girl/sequence.rb +8 -5
- data/lib/factory_girl/step_definitions.rb +18 -10
- data/lib/factory_girl/strategy.rb +1 -0
- data/lib/factory_girl/strategy/attributes_for.rb +1 -0
- data/lib/factory_girl/strategy/create.rb +1 -0
- data/lib/factory_girl/strategy/null.rb +11 -0
- data/lib/factory_girl/syntax/default.rb +2 -2
- data/lib/factory_girl/syntax/vintage.rb +11 -9
- data/lib/factory_girl/version.rb +1 -1
- data/spec/acceptance/sequence_spec.rb +28 -0
- data/spec/acceptance/syntax/vintage_spec.rb +2 -0
- data/spec/factory_girl/definition_proxy_spec.rb +1 -1
- data/spec/factory_girl/registry_spec.rb +27 -6
- data/spec/factory_girl/sequence_spec.rb +20 -0
- data/spec/factory_girl/strategy/create_spec.rb +1 -1
- data/spec/support/shared_examples/strategy.rb +7 -6
- metadata +31 -30
data/GETTING_STARTED.md
CHANGED
@@ -7,7 +7,7 @@ Update Your Gemfile
|
|
7
7
|
If you're using Rails, you'll need to change the required version of `factory_girl_rails`:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem "factory_girl_rails", "~>
|
10
|
+
gem "factory_girl_rails", "~> 3.0"
|
11
11
|
```
|
12
12
|
|
13
13
|
If you're *not* using Rails, you'll just have to change the required version of `factory_girl`:
|
@@ -27,23 +27,16 @@ Each factory has a name and a set of attributes. The name is used to guess the c
|
|
27
27
|
# This will guess the User class
|
28
28
|
FactoryGirl.define do
|
29
29
|
factory :user do
|
30
|
-
first_name
|
31
|
-
last_name
|
30
|
+
first_name "John"
|
31
|
+
last_name "Doe"
|
32
32
|
admin false
|
33
33
|
end
|
34
34
|
|
35
35
|
# This will use the User class (Admin would have been guessed)
|
36
|
-
factory :admin, :
|
37
|
-
first_name
|
38
|
-
last_name
|
39
|
-
admin
|
40
|
-
end
|
41
|
-
|
42
|
-
# The same, but using a string instead of class constant
|
43
|
-
factory :admin, :class => 'user' do
|
44
|
-
first_name 'Admin'
|
45
|
-
last_name 'User'
|
46
|
-
admin true
|
36
|
+
factory :admin, class: User do
|
37
|
+
first_name "Admin"
|
38
|
+
last_name "User"
|
39
|
+
admin true
|
47
40
|
end
|
48
41
|
end
|
49
42
|
```
|
@@ -88,7 +81,7 @@ No matter which strategy is used, it's possible to override the defined attribut
|
|
88
81
|
|
89
82
|
```ruby
|
90
83
|
# Build a User instance and override the first_name property
|
91
|
-
user = FactoryGirl.build(:user, :
|
84
|
+
user = FactoryGirl.build(:user, first_name: "Joe")
|
92
85
|
user.first_name
|
93
86
|
# => "Joe"
|
94
87
|
```
|
@@ -103,15 +96,18 @@ end
|
|
103
96
|
|
104
97
|
# Test::Unit
|
105
98
|
class Test::Unit::TestCase
|
106
|
-
include
|
99
|
+
include FactoryGirl::Syntax::Methods
|
107
100
|
end
|
101
|
+
|
102
|
+
# Cucumber
|
103
|
+
World(FactoryGirl::Syntax::Methods)
|
108
104
|
```
|
109
105
|
|
110
106
|
This would allow you to write:
|
111
107
|
|
112
108
|
```ruby
|
113
109
|
describe User, "#full_name" do
|
114
|
-
subject { create(:user, :
|
110
|
+
subject { create(:user, first_name: "John", last_name: "Doe") }
|
115
111
|
|
116
112
|
its(:full_name) { should == "John Doe" }
|
117
113
|
end
|
@@ -140,7 +136,7 @@ Aliases
|
|
140
136
|
Aliases allow you to use named associations more easily.
|
141
137
|
|
142
138
|
```ruby
|
143
|
-
factory :user, :
|
139
|
+
factory :user, aliases: [:author, :commenter] do
|
144
140
|
first_name "John"
|
145
141
|
last_name "Doe"
|
146
142
|
date_of_birth { 18.years.ago }
|
@@ -149,7 +145,7 @@ end
|
|
149
145
|
factory :post do
|
150
146
|
author
|
151
147
|
# instead of
|
152
|
-
# association :author, :
|
148
|
+
# association :author, factory: :user
|
153
149
|
title "How to read a book effectively"
|
154
150
|
body "There are five steps involved."
|
155
151
|
end
|
@@ -157,7 +153,7 @@ end
|
|
157
153
|
factory :comment do
|
158
154
|
commenter
|
159
155
|
# instead of
|
160
|
-
# association :commenter, :
|
156
|
+
# association :commenter, factory: :user
|
161
157
|
body "Great article!"
|
162
158
|
end
|
163
159
|
```
|
@@ -169,12 +165,12 @@ Attributes can be based on the values of other attributes using the evaluator th
|
|
169
165
|
|
170
166
|
```ruby
|
171
167
|
factory :user do
|
172
|
-
first_name
|
173
|
-
last_name
|
168
|
+
first_name "Joe"
|
169
|
+
last_name "Blow"
|
174
170
|
email { "#{first_name}.#{last_name}@example.com".downcase }
|
175
171
|
end
|
176
172
|
|
177
|
-
FactoryGirl.create(:user, :
|
173
|
+
FactoryGirl.create(:user, last_name: "Doe").email
|
178
174
|
# => "joe.doe@example.com"
|
179
175
|
```
|
180
176
|
|
@@ -187,7 +183,7 @@ There may be times where your code can be DRYed up by passing in transient attri
|
|
187
183
|
factory :user do
|
188
184
|
ignore do
|
189
185
|
rockstar true
|
190
|
-
upcased
|
186
|
+
upcased false
|
191
187
|
end
|
192
188
|
|
193
189
|
name { "John Doe#{" - Rockstar" if rockstar}" }
|
@@ -198,7 +194,7 @@ factory :user do
|
|
198
194
|
end
|
199
195
|
end
|
200
196
|
|
201
|
-
FactoryGirl.create(:user, :
|
197
|
+
FactoryGirl.create(:user, upcased: true).name
|
202
198
|
#=> "JOHN DOE - ROCKSTAR"
|
203
199
|
```
|
204
200
|
|
@@ -228,7 +224,7 @@ You can also specify a different factory or override attributes:
|
|
228
224
|
```ruby
|
229
225
|
factory :post do
|
230
226
|
# ...
|
231
|
-
association :author, :
|
227
|
+
association :author, factory: :user, last_name: "Writely"
|
232
228
|
end
|
233
229
|
```
|
234
230
|
|
@@ -246,12 +242,12 @@ post.new_record? # => true
|
|
246
242
|
post.author.new_record? # => false
|
247
243
|
```
|
248
244
|
|
249
|
-
To not save the associated object, specify :
|
245
|
+
To not save the associated object, specify strategy: :build in the factory:
|
250
246
|
|
251
247
|
```ruby
|
252
248
|
factory :post do
|
253
249
|
# ...
|
254
|
-
association :author, :
|
250
|
+
association :author, factory: :user, strategy: :build
|
255
251
|
end
|
256
252
|
|
257
253
|
# Builds a User, and then builds a Post, but does not save either
|
@@ -290,7 +286,7 @@ FactoryGirl.define do
|
|
290
286
|
# attributes; `create_list`'s second argument is the number of records
|
291
287
|
# to create and we make sure the user is associated properly to the post
|
292
288
|
after_create do |user, evaluator|
|
293
|
-
FactoryGirl.create_list(:post, evaluator.posts_count, :
|
289
|
+
FactoryGirl.create_list(:post, evaluator.posts_count, user: user)
|
294
290
|
end
|
295
291
|
end
|
296
292
|
end
|
@@ -302,7 +298,7 @@ This allows us to do:
|
|
302
298
|
```ruby
|
303
299
|
FactoryGirl.create(:user).posts.length # 0
|
304
300
|
FactoryGirl.create(:user_with_posts).posts.length # 5
|
305
|
-
FactoryGirl.create(:user_with_posts, :
|
301
|
+
FactoryGirl.create(:user_with_posts, posts_count: 15).posts.length # 15
|
306
302
|
```
|
307
303
|
|
308
304
|
Inheritance
|
@@ -312,7 +308,7 @@ You can easily create multiple factories for the same class without repeating co
|
|
312
308
|
|
313
309
|
```ruby
|
314
310
|
factory :post do
|
315
|
-
title
|
311
|
+
title "A title"
|
316
312
|
|
317
313
|
factory :approved_post do
|
318
314
|
approved true
|
@@ -320,7 +316,7 @@ factory :post do
|
|
320
316
|
end
|
321
317
|
|
322
318
|
approved_post = FactoryGirl.create(:approved_post)
|
323
|
-
approved_post.title
|
319
|
+
approved_post.title # => "A title"
|
324
320
|
approved_post.approved # => true
|
325
321
|
```
|
326
322
|
|
@@ -328,10 +324,10 @@ You can also assign the parent explicitly:
|
|
328
324
|
|
329
325
|
```ruby
|
330
326
|
factory :post do
|
331
|
-
title
|
327
|
+
title "A title"
|
332
328
|
end
|
333
329
|
|
334
|
-
factory :approved_post, :
|
330
|
+
factory :approved_post, parent: :post do
|
335
331
|
approved true
|
336
332
|
end
|
337
333
|
```
|
@@ -405,6 +401,35 @@ factory :post do
|
|
405
401
|
end
|
406
402
|
```
|
407
403
|
|
404
|
+
Sequences can also have aliases. The sequence aliases share the same counter:
|
405
|
+
|
406
|
+
```ruby
|
407
|
+
factory :user do
|
408
|
+
sequence(:email, 1000, aliases: [:sender, :receiver]) {|n| "person#{n}@example.com" }
|
409
|
+
end
|
410
|
+
|
411
|
+
# will increase value counter for :email which is shared by :sender and :receiver
|
412
|
+
FactoryGirl.next(:sender)
|
413
|
+
```
|
414
|
+
|
415
|
+
Define aliases and use default value (1) for the counter
|
416
|
+
|
417
|
+
```ruby
|
418
|
+
factory :user do
|
419
|
+
sequence(:email, aliases: [:sender, :receiver]) {|n| "person#{n}@example.com" }
|
420
|
+
end
|
421
|
+
```
|
422
|
+
|
423
|
+
Setting the value:
|
424
|
+
|
425
|
+
```ruby
|
426
|
+
factory :user do
|
427
|
+
sequence(:email, 'a', aliases: [:sender, :receiver]) {|n| "person#{n}@example.com" }
|
428
|
+
end
|
429
|
+
```
|
430
|
+
|
431
|
+
The value just needs to support the `#next` method. Here the next value will be 'a', then 'b', etc.
|
432
|
+
|
408
433
|
Traits
|
409
434
|
------
|
410
435
|
|
@@ -412,7 +437,7 @@ Traits allow you to group attributes together and then apply them
|
|
412
437
|
to any factory.
|
413
438
|
|
414
439
|
```ruby
|
415
|
-
factory :user, :
|
440
|
+
factory :user, aliases: [:author]
|
416
441
|
|
417
442
|
factory :story do
|
418
443
|
title "My awesome story"
|
@@ -436,17 +461,17 @@ factory :story do
|
|
436
461
|
end_at { Time.now }
|
437
462
|
end
|
438
463
|
|
439
|
-
factory :week_long_published_story, :
|
440
|
-
factory :month_long_published_story, :
|
441
|
-
factory :week_long_unpublished_story, :
|
442
|
-
factory :month_long_unpublished_story, :
|
464
|
+
factory :week_long_published_story, traits: [:published, :week_long_publishing]
|
465
|
+
factory :month_long_published_story, traits: [:published, :month_long_publishing]
|
466
|
+
factory :week_long_unpublished_story, traits: [:unpublished, :week_long_publishing]
|
467
|
+
factory :month_long_unpublished_story, traits: [:unpublished, :month_long_publishing]
|
443
468
|
end
|
444
469
|
```
|
445
470
|
|
446
471
|
Traits can be used as attributes:
|
447
472
|
|
448
473
|
```ruby
|
449
|
-
factory :week_long_published_story_with_title, :
|
474
|
+
factory :week_long_published_story_with_title, parent: :story do
|
450
475
|
published
|
451
476
|
week_long_publishing
|
452
477
|
title { "Publishing that was started at {start_at}" }
|
@@ -478,8 +503,8 @@ factory :user do
|
|
478
503
|
login { "admin-#{name}" }
|
479
504
|
end
|
480
505
|
|
481
|
-
factory :male_admin, :
|
482
|
-
factory :female_admin, :
|
506
|
+
factory :male_admin, traits: [:male, :admin] # login will be "admin-John Doe"
|
507
|
+
factory :female_admin, traits: [:admin, :female] # login will be "Jane Doe (F)"
|
483
508
|
end
|
484
509
|
```
|
485
510
|
|
@@ -520,7 +545,7 @@ factory :user do
|
|
520
545
|
end
|
521
546
|
|
522
547
|
# creates an admin user with gender "Male" and name "Jon Snow"
|
523
|
-
FactoryGirl.create(:user, :admin, :male, :
|
548
|
+
FactoryGirl.create(:user, :admin, :male, name: "Jon Snow")
|
524
549
|
```
|
525
550
|
|
526
551
|
This ability works with `build`, `build_stubbed`, `attributes_for`, and `create`.
|
@@ -539,7 +564,7 @@ factory :user do
|
|
539
564
|
end
|
540
565
|
|
541
566
|
# creates 3 admin users with gender "Male" and name "Jon Snow"
|
542
|
-
FactoryGirl.create_list(:user, 3, :admin, :male, :
|
567
|
+
FactoryGirl.create_list(:user, 3, :admin, :male, name: "Jon Snow")
|
543
568
|
```
|
544
569
|
|
545
570
|
|
@@ -607,7 +632,7 @@ Instead of creating a child factory that added additional attributes:
|
|
607
632
|
|
608
633
|
```ruby
|
609
634
|
FactoryGirl.define do
|
610
|
-
factory :application_user, :
|
635
|
+
factory :application_user, parent: :user do
|
611
636
|
full_name { Faker::Name.name }
|
612
637
|
date_of_birth { 21.years.ago }
|
613
638
|
gender "Female"
|
@@ -650,7 +675,7 @@ These methods will build or create a specific amount of factories and return the
|
|
650
675
|
To set the attributes for each of the factories, you can pass in a hash as you normally would.
|
651
676
|
|
652
677
|
```ruby
|
653
|
-
twenty_year_olds = FactoryGirl.build_list(:user, 25, :
|
678
|
+
twenty_year_olds = FactoryGirl.build_list(:user, 25, date_of_birth: 20.years.ago)
|
654
679
|
```
|
655
680
|
|
656
681
|
Custom Construction
|
@@ -708,7 +733,7 @@ Cucumber Integration
|
|
708
733
|
factory\_girl ships with step definitions that make calling factories from Cucumber easier. To use them, add the following to features/support/env.rb:
|
709
734
|
|
710
735
|
```ruby
|
711
|
-
require
|
736
|
+
require "factory_girl/step_definitions"
|
712
737
|
```
|
713
738
|
|
714
739
|
Alternate Syntaxes
|
@@ -720,16 +745,16 @@ provide alternate interfaces. See Factory::Syntax for information about the
|
|
720
745
|
various layers available. For example, the Machinist-style syntax is popular:
|
721
746
|
|
722
747
|
```ruby
|
723
|
-
require
|
724
|
-
require
|
725
|
-
require
|
748
|
+
require "factory_girl/syntax/blueprint"
|
749
|
+
require "factory_girl/syntax/make"
|
750
|
+
require "factory_girl/syntax/sham"
|
726
751
|
|
727
752
|
Sham.email {|n| "#{n}@example.com" }
|
728
753
|
|
729
754
|
User.blueprint do
|
730
|
-
name {
|
755
|
+
name { "Billy Bob" }
|
731
756
|
email { Sham.email }
|
732
757
|
end
|
733
758
|
|
734
|
-
User.make(:
|
759
|
+
User.make(name: "Johnny")
|
735
760
|
```
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
factory_girl (3.
|
4
|
+
factory_girl (3.1.0)
|
5
5
|
activesupport (>= 3.0.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -19,7 +19,7 @@ GEM
|
|
19
19
|
tzinfo (~> 0.3.29)
|
20
20
|
activesupport (3.1.0)
|
21
21
|
multi_json (~> 1.0)
|
22
|
-
appraisal (0.
|
22
|
+
appraisal (0.4.1)
|
23
23
|
bundler
|
24
24
|
rake
|
25
25
|
arel (2.2.1)
|
@@ -38,23 +38,23 @@ GEM
|
|
38
38
|
builder (3.0.0)
|
39
39
|
childprocess (0.2.2)
|
40
40
|
ffi (~> 1.0.6)
|
41
|
-
cucumber (1.
|
41
|
+
cucumber (1.1.9)
|
42
42
|
builder (>= 2.1.2)
|
43
43
|
diff-lcs (>= 1.1.2)
|
44
|
-
gherkin (~> 2.
|
44
|
+
gherkin (~> 2.9.0)
|
45
45
|
json (>= 1.4.6)
|
46
46
|
term-ansicolor (>= 1.0.6)
|
47
47
|
diff-lcs (1.1.3)
|
48
48
|
ffi (1.0.9)
|
49
|
-
gherkin (2.
|
49
|
+
gherkin (2.9.3)
|
50
50
|
json (>= 1.4.6)
|
51
51
|
i18n (0.6.0)
|
52
|
-
json (1.6.
|
52
|
+
json (1.6.6)
|
53
53
|
mocha (0.9.8)
|
54
54
|
rake
|
55
55
|
multi_json (1.0.3)
|
56
56
|
rack (1.3.3)
|
57
|
-
rake (0.9.2)
|
57
|
+
rake (0.9.2.2)
|
58
58
|
rdiscount (1.6.8)
|
59
59
|
rspec (2.6.0)
|
60
60
|
rspec-core (~> 2.6.0)
|
@@ -71,7 +71,7 @@ GEM
|
|
71
71
|
sqlite3 (1.3.4)
|
72
72
|
sqlite3-ruby (1.3.3)
|
73
73
|
sqlite3 (>= 1.3.3)
|
74
|
-
term-ansicolor (1.0.
|
74
|
+
term-ansicolor (1.0.7)
|
75
75
|
timecop (0.3.5)
|
76
76
|
tzinfo (0.3.29)
|
77
77
|
yard (0.7.2)
|
@@ -81,11 +81,11 @@ PLATFORMS
|
|
81
81
|
|
82
82
|
DEPENDENCIES
|
83
83
|
activerecord
|
84
|
-
appraisal (~> 0.
|
84
|
+
appraisal (~> 0.4)
|
85
85
|
aruba
|
86
86
|
bluecloth
|
87
87
|
bourne
|
88
|
-
cucumber (~> 1.
|
88
|
+
cucumber (~> 1.1)
|
89
89
|
factory_girl!
|
90
90
|
mocha
|
91
91
|
rspec (~> 2.0)
|
data/{Changelog → NEWS}
RENAMED
@@ -1,3 +1,10 @@
|
|
1
|
+
3.1.0 (April 6, 2012)
|
2
|
+
Sequences support aliases, which reference the same block
|
3
|
+
Update documentation
|
4
|
+
Add before_create callback
|
5
|
+
Support use of #attribute_names method to determine available attributes for steps
|
6
|
+
Use ActiveSupport::Deprecation for all deprecations
|
7
|
+
|
1
8
|
3.0.0 (March 23, 2012)
|
2
9
|
Deprecate the vintage syntax
|
3
10
|
Remove Rails 2.x support
|
data/README.md
CHANGED
@@ -25,6 +25,13 @@ gem 'factory_girl'
|
|
25
25
|
```
|
26
26
|
and run `bundle install` from your shell.
|
27
27
|
|
28
|
+
Supported Ruby versions
|
29
|
+
-----------------------
|
30
|
+
|
31
|
+
The Factory Girl 3.x series supports Ruby 1.9.x.
|
32
|
+
|
33
|
+
For older versions of Ruby, please use the Factory Girl 2.x series.
|
34
|
+
|
28
35
|
More Information
|
29
36
|
----------------
|
30
37
|
|
data/factory_girl.gemspec
CHANGED
@@ -24,13 +24,13 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_dependency("activesupport", ">= 3.0.0")
|
25
25
|
|
26
26
|
s.add_development_dependency("rspec", "~> 2.0")
|
27
|
-
s.add_development_dependency("cucumber", "~> 1.
|
27
|
+
s.add_development_dependency("cucumber", "~> 1.1")
|
28
28
|
s.add_development_dependency("timecop")
|
29
29
|
s.add_development_dependency("simplecov")
|
30
30
|
s.add_development_dependency("aruba")
|
31
31
|
s.add_development_dependency("mocha")
|
32
32
|
s.add_development_dependency("bourne")
|
33
|
-
s.add_development_dependency("appraisal", "~> 0.
|
33
|
+
s.add_development_dependency("appraisal", "~> 0.4")
|
34
34
|
s.add_development_dependency("sqlite3-ruby")
|
35
35
|
s.add_development_dependency("yard")
|
36
36
|
s.add_development_dependency("bluecloth")
|
@@ -235,3 +235,7 @@ Feature: Use step definitions generated by factories
|
|
235
235
|
Scenario: step definitions work correctly with ORMs that have simple `columns`
|
236
236
|
Given a simple column exists
|
237
237
|
Then there should be 1 SimpleColumn
|
238
|
+
|
239
|
+
Scenario: step definitions work correctly with model classes that simply have attribute names
|
240
|
+
Given a named attribute model exists with a title of "a fun title"
|
241
|
+
Then there should be 1 NamedAttributeModel
|