factory_bot 4.11.1 → 5.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/GETTING_STARTED.md +105 -29
- data/NEWS +17 -0
- data/README.md +3 -14
- data/lib/factory_bot.rb +56 -56
- data/lib/factory_bot/aliases.rb +1 -1
- data/lib/factory_bot/attribute.rb +4 -39
- data/lib/factory_bot/attribute_assigner.rb +20 -5
- data/lib/factory_bot/attribute_list.rb +2 -1
- data/lib/factory_bot/callback.rb +1 -0
- data/lib/factory_bot/configuration.rb +6 -18
- data/lib/factory_bot/declaration.rb +4 -4
- data/lib/factory_bot/declaration/association.rb +3 -1
- data/lib/factory_bot/declaration/dynamic.rb +3 -1
- data/lib/factory_bot/declaration/implicit.rb +3 -1
- data/lib/factory_bot/declaration_list.rb +1 -1
- data/lib/factory_bot/decorator.rb +5 -1
- data/lib/factory_bot/decorator/attribute_hash.rb +1 -1
- data/lib/factory_bot/decorator/invocation_tracker.rb +1 -1
- data/lib/factory_bot/definition.rb +4 -3
- data/lib/factory_bot/definition_proxy.rb +53 -62
- data/lib/factory_bot/errors.rb +4 -4
- data/lib/factory_bot/evaluation.rb +1 -1
- data/lib/factory_bot/evaluator.rb +4 -4
- data/lib/factory_bot/factory.rb +7 -7
- data/lib/factory_bot/factory_runner.rb +3 -3
- data/lib/factory_bot/find_definitions.rb +1 -1
- data/lib/factory_bot/linter.rb +35 -18
- data/lib/factory_bot/null_factory.rb +3 -0
- data/lib/factory_bot/null_object.rb +2 -2
- data/lib/factory_bot/registry.rb +15 -6
- data/lib/factory_bot/sequence.rb +0 -1
- data/lib/factory_bot/strategy/null.rb +2 -4
- data/lib/factory_bot/strategy/stub.rb +23 -29
- data/lib/factory_bot/strategy_syntax_method_registrar.rb +2 -2
- data/lib/factory_bot/syntax.rb +2 -2
- data/lib/factory_bot/syntax/default.rb +1 -1
- data/lib/factory_bot/trait.rb +2 -1
- data/lib/factory_bot/version.rb +1 -1
- metadata +68 -29
- data/lib/factory_bot/attribute/static.rb +0 -16
- data/lib/factory_bot/declaration/static.rb +0 -26
- data/lib/factory_bot/decorator/class_key_hash.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c22373774f12578e26bfcb3885c5cb3e03651230880b1d7817458c8b09637581
|
4
|
+
data.tar.gz: f75b530fbfce32a94367db37ecfe55a2b5c568f95d0b24e9a55d9d6b63e4fbcc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08c78ce623a22e0b9b7da186fdc66acc24e267ecda60ff79940ff41756d1065ef30fa52fc5e5f58d619137db876b3f8cd611f211d919f50724839272ad0e449d'
|
7
|
+
data.tar.gz: fff4a17d150ccdd07ed4c6efacfd51dc6c64cd07e563f042b864983b2569215f431ed67481e8907c4b48ba190d64369432c0259f3b6d860fbd4b588c97ec645b
|
data/GETTING_STARTED.md
CHANGED
@@ -4,16 +4,16 @@ Getting Started
|
|
4
4
|
Update Your Gemfile
|
5
5
|
-------------------
|
6
6
|
|
7
|
-
If you're using Rails
|
7
|
+
If you're using Rails:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem "factory_bot_rails"
|
10
|
+
gem "factory_bot_rails"
|
11
11
|
```
|
12
12
|
|
13
|
-
If you're *not* using Rails
|
13
|
+
If you're *not* using Rails:
|
14
14
|
|
15
15
|
```ruby
|
16
|
-
gem "factory_bot"
|
16
|
+
gem "factory_bot"
|
17
17
|
```
|
18
18
|
|
19
19
|
JRuby users: factory_bot works with JRuby starting with 1.6.7.2 (latest stable, as per July 2012).
|
@@ -102,7 +102,7 @@ If you do not include `FactoryBot::Syntax::Methods` in your test suite, then all
|
|
102
102
|
Defining factories
|
103
103
|
------------------
|
104
104
|
|
105
|
-
Each factory has a name and a set of attributes. The name is used to guess the class of the object by default
|
105
|
+
Each factory has a name and a set of attributes. The name is used to guess the class of the object by default:
|
106
106
|
|
107
107
|
```ruby
|
108
108
|
# This will guess the User class
|
@@ -112,16 +112,26 @@ FactoryBot.define do
|
|
112
112
|
last_name { "Doe" }
|
113
113
|
admin { false }
|
114
114
|
end
|
115
|
-
|
116
|
-
# This will use the User class (Admin would have been guessed)
|
117
|
-
factory :admin, class: User do
|
118
|
-
first_name { "Admin" }
|
119
|
-
last_name { "User" }
|
120
|
-
admin { true }
|
121
|
-
end
|
122
115
|
end
|
123
116
|
```
|
124
117
|
|
118
|
+
It is also possible to explicitly specify the class:
|
119
|
+
|
120
|
+
```ruby
|
121
|
+
# This will use the User class (otherwise Admin would have been guessed)
|
122
|
+
factory :admin, class: User
|
123
|
+
```
|
124
|
+
|
125
|
+
If the constant is not available
|
126
|
+
(if you are using a Rails engine that waits to load models, for example),
|
127
|
+
you can also pass a symbol or string,
|
128
|
+
which factory_bot will constantize later, once you start building objects:
|
129
|
+
|
130
|
+
```ruby
|
131
|
+
# It's OK if Doorkeeper::AccessToken isn't loaded yet
|
132
|
+
factory :access_token, class: "Doorkeeper::AccessToken"
|
133
|
+
```
|
134
|
+
|
125
135
|
Because of the block syntax in Ruby, defining attributes as `Hash`es (for
|
126
136
|
serialized/JSON columns, for example) requires two sets of curly brackets:
|
127
137
|
|
@@ -177,21 +187,15 @@ user.first_name
|
|
177
187
|
# => "Joe"
|
178
188
|
```
|
179
189
|
|
190
|
+
Note that objects created with `build_stubbed` cannot be serialized with
|
191
|
+
`Marshal.dump`, since factory_bot defines singleton methods on these objects.
|
192
|
+
|
180
193
|
Static Attributes
|
181
194
|
------------------
|
182
195
|
|
183
|
-
Static attributes
|
184
|
-
|
185
|
-
|
186
|
-
```ruby
|
187
|
-
factory :user do
|
188
|
-
# Do not use deprecated static attributes
|
189
|
-
admin true
|
190
|
-
|
191
|
-
# Use dynamic attributes instead
|
192
|
-
admin { true }
|
193
|
-
end
|
194
|
-
```
|
196
|
+
Static attributes (without a block) are no longer available in factory\_bot 5.
|
197
|
+
You can read more about the decision to remove them in
|
198
|
+
[this blog post](https://robots.thoughtbot.com/deprecating-static-attributes-in-factory_bot-4-11).
|
195
199
|
|
196
200
|
Aliases
|
197
201
|
-------
|
@@ -261,8 +265,8 @@ create(:user, upcased: true).name
|
|
261
265
|
#=> "JOHN DOE - ROCKSTAR"
|
262
266
|
```
|
263
267
|
|
264
|
-
|
265
|
-
|
268
|
+
Transient attributes will be ignored within attributes\_for and won't be
|
269
|
+
set on the model,
|
266
270
|
even if the attribute exists or you attempt to override it.
|
267
271
|
|
268
272
|
Within factory_bot's dynamic attributes, you can access transient attributes as
|
@@ -273,7 +277,7 @@ transient attributes from there.
|
|
273
277
|
Method Name / Reserved Word Attributes
|
274
278
|
-------------------------------
|
275
279
|
|
276
|
-
If your attributes conflict with existing methods or reserved words you can define them with `add_attribute`.
|
280
|
+
If your attributes conflict with existing methods or reserved words (all methods in the [DefinitionProxy](https://github.com/thoughtbot/factory_bot/blob/master/lib/factory_bot/definition_proxy.rb) class) you can define them with `add_attribute`.
|
277
281
|
|
278
282
|
```ruby
|
279
283
|
factory :dna do
|
@@ -343,9 +347,35 @@ factory :post do
|
|
343
347
|
end
|
344
348
|
```
|
345
349
|
|
346
|
-
|
350
|
+
In factory\_bot 5, associations default to using the same build strategy as
|
351
|
+
their parent object:
|
347
352
|
|
348
353
|
```ruby
|
354
|
+
FactoryBot.define do
|
355
|
+
factory :author
|
356
|
+
|
357
|
+
factory :post do
|
358
|
+
author
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
post = build(:post)
|
363
|
+
post.new_record? # => true
|
364
|
+
post.author.new_record? # => true
|
365
|
+
|
366
|
+
post = create(:post)
|
367
|
+
post.new_record? # => false
|
368
|
+
post.author.new_record? # => false
|
369
|
+
```
|
370
|
+
|
371
|
+
This is different than the default behavior for previous versions of
|
372
|
+
factory\_bot, where the association strategy would not always match the strategy
|
373
|
+
of the parent object. If you want to continue using the old behavior, you can
|
374
|
+
set the `use_parent_strategy` configuration option to `false`.
|
375
|
+
|
376
|
+
```ruby
|
377
|
+
FactoryBot.use_parent_strategy = false
|
378
|
+
|
349
379
|
# Builds and saves a User and a Post
|
350
380
|
post = create(:post)
|
351
381
|
post.new_record? # => false
|
@@ -360,6 +390,8 @@ post.author.new_record? # => false
|
|
360
390
|
To not save the associated object, specify strategy: :build in the factory:
|
361
391
|
|
362
392
|
```ruby
|
393
|
+
FactoryBot.use_parent_strategy = false
|
394
|
+
|
363
395
|
factory :post do
|
364
396
|
# ...
|
365
397
|
association :author, factory: :user, strategy: :build
|
@@ -476,6 +508,36 @@ create(:profile_with_languages).languages.length # 5
|
|
476
508
|
create(:profile_with_languages, languages_count: 15).languages.length # 15
|
477
509
|
```
|
478
510
|
|
511
|
+
Polymorphic associations can be handled with traits:
|
512
|
+
|
513
|
+
```
|
514
|
+
FactoryBot.define do
|
515
|
+
factory :video
|
516
|
+
factory :photo
|
517
|
+
|
518
|
+
factory :comment do
|
519
|
+
for_photo
|
520
|
+
|
521
|
+
trait :for_video do
|
522
|
+
association(:commentable, factory: :video)
|
523
|
+
end
|
524
|
+
|
525
|
+
trait :for_photo do
|
526
|
+
association(:commentable, factory: :photo)
|
527
|
+
end
|
528
|
+
end
|
529
|
+
end
|
530
|
+
```
|
531
|
+
|
532
|
+
This allows us to do:
|
533
|
+
|
534
|
+
```
|
535
|
+
create(:comment)
|
536
|
+
create(:comment, :for_video)
|
537
|
+
create(:comment, :for_photo)
|
538
|
+
```
|
539
|
+
|
540
|
+
|
479
541
|
Sequences
|
480
542
|
---------
|
481
543
|
|
@@ -515,6 +577,9 @@ factory :user do
|
|
515
577
|
end
|
516
578
|
```
|
517
579
|
|
580
|
+
Note that defining sequences as implicit attributes will not work if you have a
|
581
|
+
factory with the same name as the sequence.
|
582
|
+
|
518
583
|
And it's also possible to define an in-line sequence that is only used in
|
519
584
|
a particular factory:
|
520
585
|
|
@@ -623,7 +688,7 @@ factory :story do
|
|
623
688
|
end
|
624
689
|
```
|
625
690
|
|
626
|
-
Traits can be used as attributes:
|
691
|
+
Traits can be used as implicit attributes:
|
627
692
|
|
628
693
|
```ruby
|
629
694
|
factory :week_long_published_story_with_title, parent: :story do
|
@@ -633,6 +698,9 @@ factory :week_long_published_story_with_title, parent: :story do
|
|
633
698
|
end
|
634
699
|
```
|
635
700
|
|
701
|
+
Note that defining traits as implicit attributes will not work if you have a
|
702
|
+
factory or sequence with the same name as the trait.
|
703
|
+
|
636
704
|
Traits that define the same attributes won't raise AttributeDefinitionErrors;
|
637
705
|
the trait that defines the attribute latest gets precedence.
|
638
706
|
|
@@ -999,6 +1067,7 @@ namespace :factory_bot do
|
|
999
1067
|
desc "Verify that all FactoryBot factories are valid"
|
1000
1068
|
task lint: :environment do
|
1001
1069
|
if Rails.env.test?
|
1070
|
+
DatabaseCleaner.clean_with(:deletion)
|
1002
1071
|
DatabaseCleaner.cleaning do
|
1003
1072
|
FactoryBot.lint
|
1004
1073
|
end
|
@@ -1047,6 +1116,13 @@ You can also specify the strategy used for linting:
|
|
1047
1116
|
FactoryBot.lint strategy: :build
|
1048
1117
|
```
|
1049
1118
|
|
1119
|
+
Verbose linting will include full backtraces for each error, which can be
|
1120
|
+
helpful for debugging:
|
1121
|
+
|
1122
|
+
```ruby
|
1123
|
+
FactoryBot.lint verbose: :true
|
1124
|
+
```
|
1125
|
+
|
1050
1126
|
Custom Construction
|
1051
1127
|
-------------------
|
1052
1128
|
|
data/NEWS
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
5.0.0
|
2
|
+
Added: Verbose option to include full backtraces in the linting output
|
3
|
+
Changed: use_parent_strategy now defaults to true, so by default the
|
4
|
+
build strategy will build, rather than create associations
|
5
|
+
Changed: Passing a block when defining associations now raises an error
|
6
|
+
Bugfix: use_parent_strategy is no longer reset by FactoryBot.reload
|
7
|
+
Bugfix: rewind_sequences will now rewind local sequences along with the global ones
|
8
|
+
Bugfix: the build_stubbed strategy now sets timestamps without changing the
|
9
|
+
the original behavior of the timestamp methods
|
10
|
+
Bugfix: avoid a stack error when referring to an "attributes" attribute in initialize_with
|
11
|
+
Removed: support for EOL versions of Ruby and Rails
|
12
|
+
Removed: static attributes (use dynamic attributes with a block instead)
|
13
|
+
Removed: looking up factories by class
|
14
|
+
Removed: ignore method (use transient instead)
|
15
|
+
Removed: duplicate_attribute_assignment_from_initialize_with configuration option
|
16
|
+
Deprecated: allow_class_lookup configuration option
|
17
|
+
|
1
18
|
4.11.1 (September 7, 2018)
|
2
19
|
Documentation: Include .yardopts in the gem to fix broken RubyDoc links
|
3
20
|
|
data/README.md
CHANGED
@@ -21,7 +21,7 @@ You should find the documentation for your version of factory_bot on [Rubygems](
|
|
21
21
|
See [GETTING_STARTED] for information on defining and using factories. We also
|
22
22
|
have [a detailed introductory video][], available for free on Upcase.
|
23
23
|
|
24
|
-
[a detailed introductory video]: https://upcase.com/videos/factory-
|
24
|
+
[a detailed introductory video]: https://upcase.com/videos/factory-bot?utm_source=github&utm_medium=open-source&utm_campaign=factory-girl
|
25
25
|
|
26
26
|
Install
|
27
27
|
--------
|
@@ -40,22 +40,11 @@ To install the gem manually from your shell, run:
|
|
40
40
|
gem install factory_bot
|
41
41
|
```
|
42
42
|
|
43
|
-
**Caveat:** As of ActiveSupport 5.0 and above, Ruby 2.2.2+ is required. Because
|
44
|
-
of Rubygems' dependency resolution when installing gems, you may see an error
|
45
|
-
similar to:
|
46
|
-
|
47
|
-
```
|
48
|
-
$ gem install factory_bot
|
49
|
-
ERROR: Error installing factory_bot:
|
50
|
-
activesupport requires Ruby version >= 2.2.2.
|
51
|
-
```
|
52
|
-
|
53
|
-
To bypass this, install a pre-5.0 version of ActiveSupport before installing
|
54
|
-
manually.
|
55
|
-
|
56
43
|
Supported Ruby versions
|
57
44
|
-----------------------
|
58
45
|
|
46
|
+
The factory_bot 5.x series supports MRI Ruby 2.3+.
|
47
|
+
|
59
48
|
The factory_bot 3.x+ series supports MRI Ruby 1.9. Additionally, factory_bot
|
60
49
|
3.6+ supports JRuby 1.6.7.2+ while running in 1.9 mode. See [GETTING_STARTED]
|
61
50
|
for more information on configuring the JRuby environment.
|
data/lib/factory_bot.rb
CHANGED
@@ -1,52 +1,54 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
|
6
|
-
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
29
|
-
require
|
30
|
-
require
|
31
|
-
require
|
32
|
-
require
|
33
|
-
require
|
34
|
-
require
|
35
|
-
require
|
36
|
-
require
|
37
|
-
require
|
38
|
-
require
|
39
|
-
require
|
40
|
-
require
|
41
|
-
require
|
42
|
-
require
|
43
|
-
require
|
44
|
-
require
|
45
|
-
require
|
46
|
-
require
|
47
|
-
require
|
1
|
+
require "set"
|
2
|
+
require "active_support/core_ext/module/delegation"
|
3
|
+
require "active_support/core_ext/module/attribute_accessors"
|
4
|
+
require "active_support/deprecation"
|
5
|
+
require "active_support/notifications"
|
6
|
+
|
7
|
+
require "factory_bot/definition_hierarchy"
|
8
|
+
require "factory_bot/configuration"
|
9
|
+
require "factory_bot/errors"
|
10
|
+
require "factory_bot/factory_runner"
|
11
|
+
require "factory_bot/strategy_syntax_method_registrar"
|
12
|
+
require "factory_bot/strategy_calculator"
|
13
|
+
require "factory_bot/strategy/build"
|
14
|
+
require "factory_bot/strategy/create"
|
15
|
+
require "factory_bot/strategy/attributes_for"
|
16
|
+
require "factory_bot/strategy/stub"
|
17
|
+
require "factory_bot/strategy/null"
|
18
|
+
require "factory_bot/registry"
|
19
|
+
require "factory_bot/null_factory"
|
20
|
+
require "factory_bot/null_object"
|
21
|
+
require "factory_bot/evaluation"
|
22
|
+
require "factory_bot/factory"
|
23
|
+
require "factory_bot/attribute_assigner"
|
24
|
+
require "factory_bot/evaluator"
|
25
|
+
require "factory_bot/evaluator_class_definer"
|
26
|
+
require "factory_bot/attribute"
|
27
|
+
require "factory_bot/callback"
|
28
|
+
require "factory_bot/callbacks_observer"
|
29
|
+
require "factory_bot/declaration_list"
|
30
|
+
require "factory_bot/declaration"
|
31
|
+
require "factory_bot/sequence"
|
32
|
+
require "factory_bot/attribute_list"
|
33
|
+
require "factory_bot/trait"
|
34
|
+
require "factory_bot/aliases"
|
35
|
+
require "factory_bot/definition"
|
36
|
+
require "factory_bot/definition_proxy"
|
37
|
+
require "factory_bot/syntax"
|
38
|
+
require "factory_bot/syntax_runner"
|
39
|
+
require "factory_bot/find_definitions"
|
40
|
+
require "factory_bot/reload"
|
41
|
+
require "factory_bot/decorator"
|
42
|
+
require "factory_bot/decorator/attribute_hash"
|
43
|
+
require "factory_bot/decorator/disallows_duplicates_registry"
|
44
|
+
require "factory_bot/decorator/invocation_tracker"
|
45
|
+
require "factory_bot/decorator/new_constructor"
|
46
|
+
require "factory_bot/linter"
|
47
|
+
require "factory_bot/version"
|
48
48
|
|
49
49
|
module FactoryBot
|
50
|
+
DEPRECATOR = ActiveSupport::Deprecation.new("6.0", "factory_bot")
|
51
|
+
|
50
52
|
def self.configuration
|
51
53
|
@configuration ||= Configuration.new
|
52
54
|
end
|
@@ -55,18 +57,19 @@ module FactoryBot
|
|
55
57
|
@configuration = nil
|
56
58
|
end
|
57
59
|
|
60
|
+
mattr_accessor :use_parent_strategy, instance_accessor: false, default: true
|
61
|
+
|
58
62
|
# Look for errors in factories and (optionally) their traits.
|
59
63
|
# Parameters:
|
60
64
|
# factories - which factories to lint; omit for all factories
|
61
65
|
# options:
|
62
66
|
# traits: true - to lint traits as well as factories
|
63
67
|
# strategy: :create - to specify the strategy for linting
|
68
|
+
# verbose: true - to include full backtraces for each linting error
|
64
69
|
def self.lint(*args)
|
65
70
|
options = args.extract_options!
|
66
71
|
factories_to_lint = args[0] || FactoryBot.factories
|
67
|
-
|
68
|
-
factory_strategy = options[:strategy] || :create
|
69
|
-
Linter.new(factories_to_lint, linting_strategy, factory_strategy).lint!
|
72
|
+
Linter.new(factories_to_lint, options).lint!
|
70
73
|
end
|
71
74
|
|
72
75
|
class << self
|
@@ -80,13 +83,10 @@ module FactoryBot
|
|
80
83
|
:skip_create,
|
81
84
|
:initialize_with,
|
82
85
|
:constructor,
|
83
|
-
:duplicate_attribute_assignment_from_initialize_with,
|
84
|
-
:duplicate_attribute_assignment_from_initialize_with=,
|
85
|
-
:allow_class_lookup,
|
86
|
-
:allow_class_lookup=,
|
87
|
-
:use_parent_strategy,
|
88
|
-
:use_parent_strategy=,
|
89
86
|
to: :configuration
|
87
|
+
|
88
|
+
attr_accessor :allow_class_lookup
|
89
|
+
deprecate :allow_class_lookup, :allow_class_lookup=, deprecator: DEPRECATOR
|
90
90
|
end
|
91
91
|
|
92
92
|
def self.register_factory(factory)
|