factory_bot 6.5.4 → 6.5.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0658ea1fd8d3b33128d6a88be3b64855cf80238bc0d2bf109f85a59b4398504f'
4
- data.tar.gz: 1cc9fb919e03d2ad95589e5519b19b1c8bd0ec1b6d0e45ee6479ff6d8f2541ad
3
+ metadata.gz: 5268f67c49f294395edabe86ef2bf7bdd3644db872328f0134d832b8cbfe5396
4
+ data.tar.gz: 5e51702b4c819af99587ea2355b43b5770b228e1f0b81483b1bc9aa28806c630
5
5
  SHA512:
6
- metadata.gz: '092799b8ba784bb640a2422ff8556d5c13c92a67b8224bd4730c4b2791995d4f56797ccf2815416e2fb21a474c41b47cc87df61564adae4cb3d0dc832c22f520'
7
- data.tar.gz: 1cc5060b814c06ed943ed825df2b913fb857b118837a850152f7b9044328de0a277f112365f10d8e66001d270b0059da77bef190ed712558c7186af00a1ccc4c
6
+ metadata.gz: 80f08c8d63755aa32390aadfd2b5c653915a2d8920b58d56b89a6091c029a0194a007b5f6c99277f94c175a0c0c83463ce24d5849268ac8d3ab76c059379116d
7
+ data.tar.gz: f092552d291c38644d02d77a73722b5966cc33397a1dcd06cb90164da65779c14f8a0352c77fd19890d30ccbe112d66a21c130865486da0b8059168e3f4a30e7
data/GETTING_STARTED.md CHANGED
@@ -17,9 +17,9 @@ at any time.
17
17
  Getting Started
18
18
  ===============
19
19
 
20
- * [Setup](#setup)
21
- + [Update Your Gemfile](#update-your-gemfile)
22
- + [Configure your test suite](#configure-your-test-suite)
20
+ - [Setup](#setup)
21
+ - [Update Your Gemfile](#update-your-gemfile)
22
+ - [Configure your test suite](#configure-your-test-suite)
23
23
  - [RSpec](#rspec)
24
24
  - [Test::Unit](#testunit)
25
25
  - [Cucumber](#cucumber)
@@ -27,76 +27,77 @@ Getting Started
27
27
  - [Minitest](#minitest)
28
28
  - [Minitest::Spec](#minitestspec)
29
29
  - [minitest-rails](#minitest-rails)
30
- * [Defining factories](#defining-factories)
31
- + [Factory name and attributes](#factory-name-and-attributes)
32
- + [Specifying the class explicitly](#specifying-the-class-explicitly)
33
- + [Hash attributes](#hash-attributes)
34
- + [Best practices](#best-practices)
35
- + [Definition file paths](#definition-file-paths)
36
- + [Static Attributes](#static-attributes)
37
- * [Using factories](#using-factories)
38
- + [Build strategies](#build-strategies)
39
- + [Attribute overrides](#attribute-overrides)
40
- + [`build_stubbed` and `Marshal.dump`](#build_stubbed-and-marshaldump)
41
- * [Aliases](#aliases)
42
- * [Dependent Attributes](#dependent-attributes)
43
- * [Transient Attributes](#transient-attributes)
44
- + [With other attributes](#with-other-attributes)
45
- + [With `attributes_for`](#with-attributes_for)
46
- + [With callbacks](#with-callbacks)
47
- + [With associations](#with-associations)
48
- * [Method Name / Reserved Word Attributes](#method-name--reserved-word-attributes)
49
- * [Inheritance](#inheritance)
50
- + [Nested factories](#nested-factories)
51
- + [Assigning parent explicitly](#assigning-parent-explicitly)
52
- + [Best practices](#best-practices-1)
53
- * [Associations](#associations)
54
- + [Implicit definition](#implicit-definition)
55
- + [Explicit definition](#explicit-definition)
56
- + [Inline definition](#inline-definition)
57
- + [Specifying the factory](#specifying-the-factory)
58
- + [Overriding attributes](#overriding-attributes)
59
- + [Association overrides](#association-overrides)
60
- + [Build strategies](#build-strategies-1)
61
- + [`has_many` associations](#has_many-associations)
62
- + [`has_and_belongs_to_many` associations](#has_and_belongs_to_many-associations)
63
- + [Polymorphic associations](#polymorphic-associations)
64
- + [Interconnected associations](#interconnected-associations)
65
- * [Sequences](#sequences)
66
- + [Global sequences](#global-sequences)
67
- + [With dynamic attributes](#with-dynamic-attributes)
68
- + [As implicit attributes](#as-implicit-attributes)
69
- + [Inline sequences](#inline-sequences)
70
- + [Initial value](#initial-value)
71
- + [Without a block](#without-a-block)
72
- + [Aliases](#aliases-1)
73
- + [Rewinding](#rewinding)
74
- + [Uniqueness](#uniqueness)
75
- * [Traits](#traits)
76
- + [Defining traits](#defining-traits)
77
- + [As implicit attributes](#as-implicit-attributes-1)
78
- + [Attribute precedence](#attribute-precedence)
79
- + [In child factories](#in-child-factories)
80
- + [Using traits](#using-traits)
81
- + [With associations](#with-associations-1)
82
- + [Traits within traits](#traits-within-traits)
83
- + [With transient attributes](#with-transient-attributes)
84
- + [Enum traits](#enum-traits)
85
- * [Callbacks](#callbacks)
86
- + [Default callbacks](#default-callbacks)
87
- + [Multiple callbacks](#multiple-callbacks)
88
- + [Global callbacks](#global-callbacks)
89
- + [Symbol#to_proc](#symbolto_proc)
90
- * [Modifying factories](#modifying-factories)
91
- * [Building or Creating Multiple Records](#building-or-creating-multiple-records)
92
- * [Linting Factories](#linting-factories)
93
- * [Custom Construction](#custom-construction)
94
- * [Custom Strategies](#custom-strategies)
95
- * [Custom Callbacks](#custom-callbacks)
96
- * [Custom Methods to Persist Objects](#custom-methods-to-persist-objects)
97
- * [ActiveSupport Instrumentation](#activesupport-instrumentation)
98
- * [Rails Preloaders and RSpec](#rails-preloaders-and-rspec)
99
- * [Using Without Bundler](#using-without-bundler)
30
+ - [Defining factories](#defining-factories)
31
+ - [Factory name and attributes](#factory-name-and-attributes)
32
+ - [Specifying the class explicitly](#specifying-the-class-explicitly)
33
+ - [Hash attributes](#hash-attributes)
34
+ - [Best practices](#best-practices)
35
+ - [Definition file paths](#definition-file-paths)
36
+ - [Static Attributes](#static-attributes)
37
+ - [Using factories](#using-factories)
38
+ - [Build strategies](#build-strategies)
39
+ - [Attribute overrides](#attribute-overrides)
40
+ - [build\_stubbed and Marshal.dump](#build_stubbed-and-marshaldump)
41
+ - [Aliases](#aliases)
42
+ - [Dependent Attributes](#dependent-attributes)
43
+ - [Transient Attributes](#transient-attributes)
44
+ - [With other attributes](#with-other-attributes)
45
+ - [With attributes\_for](#with-attributes_for)
46
+ - [With callbacks](#with-callbacks)
47
+ - [With associations](#with-associations)
48
+ - [Method Name / Reserved Word Attributes](#method-name--reserved-word-attributes)
49
+ - [Inheritance](#inheritance)
50
+ - [Nested factories](#nested-factories)
51
+ - [Assigning parent explicitly](#assigning-parent-explicitly)
52
+ - [Best practices](#best-practices-1)
53
+ - [Associations](#associations)
54
+ - [Implicit definition](#implicit-definition)
55
+ - [Explicit definition](#explicit-definition)
56
+ - [Inline definition](#inline-definition)
57
+ - [Specifying the factory](#specifying-the-factory)
58
+ - [Overriding attributes](#overriding-attributes)
59
+ - [Association overrides](#association-overrides)
60
+ - [Build strategies](#build-strategies-1)
61
+ - [has\_many associations](#has_many-associations)
62
+ - [has\_and\_belongs\_to\_many associations](#has_and_belongs_to_many-associations)
63
+ - [Polymorphic associations](#polymorphic-associations)
64
+ - [Interconnected associations](#interconnected-associations)
65
+ - [Sequences](#sequences)
66
+ - [Global sequences](#global-sequences)
67
+ - [With dynamic attributes](#with-dynamic-attributes)
68
+ - [As implicit attributes](#as-implicit-attributes)
69
+ - [Inline sequences](#inline-sequences)
70
+ - [Initial value](#initial-value)
71
+ - [Without a block](#without-a-block)
72
+ - [Aliases](#aliases-1)
73
+ - [Rewinding](#rewinding)
74
+ - [Uniqueness](#uniqueness)
75
+ - [Traits](#traits)
76
+ - [Defining traits](#defining-traits)
77
+ - [As implicit attributes](#as-implicit-attributes-1)
78
+ - [Attribute precedence](#attribute-precedence)
79
+ - [In child factories](#in-child-factories)
80
+ - [As mixins](#as-mixins)
81
+ - [Using traits](#using-traits)
82
+ - [With associations](#with-associations-1)
83
+ - [Traits within traits](#traits-within-traits)
84
+ - [With transient attributes](#with-transient-attributes)
85
+ - [Enum traits](#enum-traits)
86
+ - [Callbacks](#callbacks)
87
+ - [Default callbacks](#default-callbacks)
88
+ - [Multiple callbacks](#multiple-callbacks)
89
+ - [Global callbacks](#global-callbacks)
90
+ - [Symbol#to\_proc](#symbolto_proc)
91
+ - [Modifying factories](#modifying-factories)
92
+ - [Building or Creating Multiple Records](#building-or-creating-multiple-records)
93
+ - [Linting Factories](#linting-factories)
94
+ - [Custom Construction](#custom-construction)
95
+ - [Custom Strategies](#custom-strategies)
96
+ - [Custom Callbacks](#custom-callbacks)
97
+ - [Custom Methods to Persist Objects](#custom-methods-to-persist-objects)
98
+ - [ActiveSupport Instrumentation](#activesupport-instrumentation)
99
+ - [Rails Preloaders and RSpec](#rails-preloaders-and-rspec)
100
+ - [Using Without Bundler](#using-without-bundler)
100
101
 
101
102
  Setup
102
103
  -----
@@ -219,6 +220,26 @@ It is also possible to explicitly specify the class:
219
220
  factory :admin, class: "User"
220
221
  ```
221
222
 
223
+ Explicit specification of the class, _with the full namespace_, is necessary when defining factories for classes nested within other modules or classes:
224
+
225
+ ```ruby
226
+ # foo/bar.rb
227
+ module Foo
228
+ class Bar
229
+ ...
230
+ end
231
+ end
232
+
233
+ # factories.rb
234
+ FactoryBot.define do
235
+ factory :bar, class: 'Foo::Bar' do
236
+ ...
237
+ end
238
+ end
239
+ ```
240
+
241
+ If the full namespace is not provided in the `factory` statement, you will receive a `NameError: uninitialized constant Bar` error.
242
+
222
243
  You can pass a constant as well, if the constant is available (note that this
223
244
  can cause test performance problems in large Rails applications, since
224
245
  referring to the constant will cause it to be eagerly loaded).
@@ -334,7 +355,7 @@ user = build(:user, account:, friends:)
334
355
 
335
356
  [omitting values]: https://docs.ruby-lang.org/en/3.1/syntax/literals_rdoc.html#label-Hash+Literals
336
357
 
337
- ### `build_stubbed` and `Marshal.dump`
358
+ ### build_stubbed and Marshal.dump
338
359
 
339
360
  Note that objects created with `build_stubbed` cannot be serialized with
340
361
  `Marshal.dump`, since factory\_bot defines singleton methods on these objects.
@@ -415,7 +436,7 @@ create(:user, rockstar: false).name
415
436
  #=> "John Doe"
416
437
  ```
417
438
 
418
- ### With `attributes_for`
439
+ ### With attributes_for
419
440
 
420
441
  Transient attributes will be ignored within attributes\_for and won't be set on
421
442
  the model, even if the attribute exists or you attempt to override it.
@@ -621,7 +642,7 @@ end
621
642
 
622
643
  Or inline using attributes from the factory:
623
644
 
624
- ```rb
645
+ ```ruby
625
646
  factory :post do
626
647
  # ...
627
648
  author_last_name { "Writely" }
@@ -715,7 +736,7 @@ factory :post do
715
736
  author strategy: :build # <<< this does *not* work; causes author_id to be nil
716
737
  ```
717
738
 
718
- ### `has_many` associations
739
+ ### has_many associations
719
740
 
720
741
  There are a few ways to generate data for a `has_many` relationship. The
721
742
  simplest approach is to write a helper method in plain Ruby to tie together the
@@ -842,7 +863,7 @@ build(:user_with_posts, posts_count: 15).posts.length # 15
842
863
  build_stubbed(:user_with_posts, posts_count: 15).posts.length # 15
843
864
  ```
844
865
 
845
- ### `has_and_belongs_to_many` associations
866
+ ### has_and_belongs_to_many associations
846
867
 
847
868
  Generating data for a `has_and_belongs_to_many` relationship is very similar
848
869
  to the above `has_many` relationship, with a small change: you need to pass an
@@ -1132,7 +1153,7 @@ When working with uniqueness constraints, be careful not to pass in override val
1132
1153
 
1133
1154
  In this example the email will be the same for both users. If email must be unique, this code will error:
1134
1155
 
1135
- ```rb
1156
+ ```ruby
1136
1157
  factory :user do
1137
1158
  sequence(:email) { |n| "person#{n}@example.com" }
1138
1159
  end
@@ -1398,7 +1419,7 @@ create :invoice, :with_amount, amount: 2
1398
1419
 
1399
1420
  Given an Active Record model with an enum attribute:
1400
1421
 
1401
- ```rb
1422
+ ```ruby
1402
1423
  class Task < ActiveRecord::Base
1403
1424
  enum status: {queued: 0, started: 1, finished: 2}
1404
1425
  end
@@ -1408,7 +1429,7 @@ end
1408
1429
  factory\_bot will automatically define traits for each possible value of the
1409
1430
  enum:
1410
1431
 
1411
- ```rb
1432
+ ```ruby
1412
1433
  FactoryBot.define do
1413
1434
  factory :task
1414
1435
  end
@@ -1420,7 +1441,7 @@ FactoryBot.build(:task, :finished)
1420
1441
 
1421
1442
  Writing the traits out manually would be cumbersome, and is not necessary:
1422
1443
 
1423
- ```rb
1444
+ ```ruby
1424
1445
  FactoryBot.define do
1425
1446
  factory :task do
1426
1447
  trait :queued do
@@ -1445,7 +1466,7 @@ desired, it is possible to disable the feature by setting
1445
1466
  In that case, it is still possible to explicitly define traits for an enum
1446
1467
  attribute in a particular factory:
1447
1468
 
1448
- ```rb
1469
+ ```ruby
1449
1470
  FactoryBot.automatically_define_enum_traits = false
1450
1471
 
1451
1472
  FactoryBot.define do
@@ -1460,7 +1481,7 @@ specifically tied to Active Record enum attributes.
1460
1481
 
1461
1482
  With an array:
1462
1483
 
1463
- ```rb
1484
+ ```ruby
1464
1485
  class Task
1465
1486
  attr_accessor :status
1466
1487
  end
@@ -1474,7 +1495,7 @@ end
1474
1495
 
1475
1496
  Or with a hash:
1476
1497
 
1477
- ```rb
1498
+ ```ruby
1478
1499
  class Task
1479
1500
  attr_accessor :status
1480
1501
  end