Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Pending |
No |
Yes (Unsafe) |
2.23 |
2.24 |
Use a consistent style to define associations.
This cop may cause false-positives in EnforcedStyle: explicit
case. It recognizes any method call that has no arguments as an
implicit association but it might be a user-defined trait call.
# bad
factory :post do
association :user
end
# good
factory :post do
user
end
# bad
factory :post do
association :user, :author
end
# good
factory :post do
user factory: %i[user author]
end
# bad
factory :post do
user
end
# good
factory :post do
association :user
end
# bad
factory :post do
user factory: %i[user author]
end
# good
factory :post do
association :user, :author
end
# good (NonImplicitAssociationMethodNames: ['email'])
sequence :email do |n|
"person#{n}@example.com"
end
factory :user do
email
end
Name | Default value | Configurable values |
---|---|---|
EnforcedStyle |
|
|
NonImplicitAssociationMethodNames |
|
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Enabled |
Yes |
Yes |
1.28 |
2.24 |
Always declare attribute values as blocks.
# bad
kind [:active, :rejected].sample
# good
kind { [:active, :rejected].sample }
# bad
closed_at 1.day.from_now
# good
closed_at { 1.day.from_now }
# bad
count 1
# good
count { 1 }
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Pending |
Yes |
Yes |
2.14 |
2.23 |
Use a consistent style for parentheses in factory_bot calls.
# bad
create :user
build :login
# good
create(:user)
build(:login)
# bad
create(:user)
build(:login)
# good
create :user
build :login
# also good
# when method name and first argument are not on same line
create(
:user
)
build(
:user,
name: 'foo'
)
# bad - with `EnforcedStyle: require_parentheses`
FactoryBot.create :user
build :user
# good - with `EnforcedStyle: require_parentheses`
FactoryBot.create(:user)
build(:user)
Name | Default value | Configurable values |
---|---|---|
Include |
|
Array |
EnforcedStyle |
|
|
ExplicitOnly |
|
Boolean |
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Enabled |
Yes |
Yes (Unsafe) |
1.25 |
2.24 |
Checks for create_list usage.
This cop can be configured using the EnforcedStyle
option
This cop’s autocorrection is unsafe because replacing n.times
to
create_list
changes its returned value.
# bad
3.times { create :user }
3.times.map { create :user }
[create(:user), create(:user), create(:user)]
Array.new(3) { create :user }
# good
create_list :user, 3
# bad
3.times { create :user, age: 18 }
# good - index is used to alter the created models attributes
3.times { |n| create :user, age: n }
# good - contains a method call, may return different values
3.times { create :user, age: rand }
# bad
create_list :user, 3
[create(:user), create(:user), create(:user)]
# good
3.times.map { create :user }
# bad - with `EnforcedStyle: create_list`
3.times { FactoryBot.create :user }
3.times { create :user }
# good - with `EnforcedStyle: create_list`
FactoryBot.create_list :user, 3
create_list :user, 3
Name | Default value | Configurable values |
---|---|---|
Include |
|
Array |
EnforcedStyle |
|
|
ExplicitOnly |
|
Boolean |
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Pending |
Yes |
No |
2.25 |
- |
Check for excessive model creation in a list.
# We do not allow more than 10 items to be created
# bad
create_list(:merge_request, 1000, state: :opened)
# good
create_list(:merge_request, 10, state: :opened)
Name | Default value | Configurable values |
---|---|---|
Include |
|
Array |
MaxAmount |
|
Integer |
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Pending |
Yes |
No |
2.23 |
2.23 |
Use definition in factory association instead of hard coding a strategy.
# bad - only works for one strategy
factory :foo do
profile { create(:profile) }
end
# good - implicit
factory :foo do
profile
end
# good - explicit
factory :foo do
association :profile
end
# good - inline
factory :foo do
profile { association :profile }
end
Name | Default value | Configurable values |
---|---|---|
Include |
|
Array |
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Enabled |
Yes |
Yes |
1.37 |
2.24 |
Use string value when setting the class attribute explicitly.
This cop would promote faster tests by lazy-loading of application files. Also, this could help you suppress potential bugs in combination with external libraries by avoiding a preload of application files from the factory files.
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Pending |
Yes |
Yes |
2.16 |
2.23 |
Checks for name style for argument of FactoryBot::Syntax::Methods.
# bad
create('user')
build "user", username: "NAME"
# good
create(:user)
build :user, username: "NAME"
# good - namespaced models
create('users/internal')
# bad
create(:user)
build :user, username: "NAME"
# good
create('user')
build "user", username: "NAME"
# bad - with `EnforcedStyle: symbol`
FactoryBot.create('user')
create('user')
# good - with `EnforcedStyle: symbol`
FactoryBot.create(:user)
create(:user)
Name | Default value | Configurable values |
---|---|---|
Include |
|
Array |
EnforcedStyle |
|
|
ExplicitOnly |
|
Boolean |
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Pending |
Yes |
Yes |
2.24 |
- |
Do not create a FactoryBot sequence for an id column.
# bad - can lead to conflicts between FactoryBot and DB sequences
factory :foo do
sequence :id
end
# good - a non-id column
factory :foo do
sequence :some_non_id_column
end
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Pending |
Yes |
Yes |
2.23 |
- |
Checks for redundant factory
option.
Name | Default value | Configurable values |
---|---|---|
Include |
|
Array |
Enabled by default | Safe | Supports autocorrection | Version Added | Version Changed |
---|---|---|---|---|
Pending |
Yes |
Yes (Unsafe) |
2.7 |
- |
Use shorthands from FactoryBot::Syntax::Methods
in your specs.
The autocorrection is marked as unsafe because the cop
cannot verify whether you already include
FactoryBot::Syntax::Methods
in your test suite.
If you’re using Rails, add the following configuration to
spec/support/factory_bot.rb
and be sure to require that file in
rails_helper.rb
:
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
end
If you’re not using Rails:
RSpec.configure do |config|
config.include FactoryBot::Syntax::Methods
config.before(:suite) do
FactoryBot.find_definitions
end
end
# bad
FactoryBot.create(:bar)
FactoryBot.build(:bar)
FactoryBot.attributes_for(:bar)
# good
create(:bar)
build(:bar)
attributes_for(:bar)
Name | Default value | Configurable values |
---|---|---|
Include |
|
Array |