FactoryBot

FactoryBot/AssociationStyle

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

No

Yes (Unsafe)

2.23

[next]

Use a consistent style to define associations.

Safety

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.

Examples

EnforcedStyle: implicit (default)

# 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

EnforcedStyle: explicit

# 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

Configurable attributes

Name Default value Configurable values

EnforcedStyle

implicit

explicit, implicit

NonImplicitAssociationMethodNames

<none>

FactoryBot/AttributeDefinedStatically

Enabled by default Safe Supports autocorrection Version Added Version Changed

Enabled

Yes

Yes

1.28

[next]

Always declare attribute values as blocks.

Examples

# 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 }

FactoryBot/ConsistentParenthesesStyle

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.

Examples

EnforcedStyle: require_parentheses (default)

# bad
create :user
build :login

# good
create(:user)
build(:login)

EnforcedStyle: omit_parentheses

# 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'
)

ExplicitOnly: false (default)

# bad - with `EnforcedStyle: require_parentheses`
FactoryBot.create :user
build :user

# good - with `EnforcedStyle: require_parentheses`
FactoryBot.create(:user)
build(:user)

ExplicitOnly: true

# bad - with `EnforcedStyle: require_parentheses`
FactoryBot.create :user
FactoryBot.build :user

# good - with `EnforcedStyle: require_parentheses`
FactoryBot.create(:user)
FactoryBot.build(:user)
create :user
build :user

Configurable attributes

Name Default value Configurable values

Include

**/*_spec.rb, **/spec/**/*, **/test/**/*, **/features/support/factories/**/*.rb

Array

EnforcedStyle

require_parentheses

require_parentheses, omit_parentheses

ExplicitOnly

false

Boolean

FactoryBot/CreateList

Enabled by default Safe Supports autocorrection Version Added Version Changed

Enabled

Yes

Yes (Unsafe)

1.25

[next]

Checks for create_list usage.

This cop can be configured using the EnforcedStyle option

Safety

This cop’s autocorrection is unsafe because replacing n.times to create_list changes its returned value.

Examples

EnforcedStyle: create_list (default)

# 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 }

EnforcedStyle: n_times

# bad
create_list :user, 3
[create(:user), create(:user), create(:user)]

# good
3.times.map { create :user }

ExplicitOnly: false (default)

# 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

ExplicitOnly: true

# bad - with `EnforcedStyle: create_list`
3.times { FactoryBot.create :user }

# good - with `EnforcedStyle: create_list`
FactoryBot.create_list :user, 3
create_list :user, 3
3.times { create :user }

Configurable attributes

Name Default value Configurable values

Include

**/*_spec.rb, **/spec/**/*, **/test/**/*, **/features/support/factories/**/*.rb

Array

EnforcedStyle

create_list

create_list, n_times

ExplicitOnly

false

Boolean

FactoryBot/FactoryAssociationWithStrategy

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.

Examples

# 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

Configurable attributes

Name Default value Configurable values

Include

**/*_spec.rb, **/spec/**/*, **/test/**/*, **/features/support/factories/**/*.rb

Array

FactoryBot/FactoryClassName

Enabled by default Safe Supports autocorrection Version Added Version Changed

Enabled

Yes

Yes

1.37

[next]

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.

Examples

# bad
factory :foo, class: Foo do
end

# good
factory :foo, class: 'Foo' do
end

FactoryBot/FactoryNameStyle

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.

Examples

EnforcedStyle: symbol (default)

# bad
create('user')
build "user", username: "NAME"

# good
create(:user)
build :user, username: "NAME"

EnforcedStyle: string

# bad
create(:user)
build :user, username: "NAME"

# good
create('user')
build "user", username: "NAME"

ExplicitOnly: false (default)

# bad - with `EnforcedStyle: symbol`
FactoryBot.create('user')
create('user')

# good - with `EnforcedStyle: symbol`
FactoryBot.create(:user)
create(:user)

ExplicitOnly: true

# bad - with `EnforcedStyle: symbol`
FactoryBot.create(:user)
FactoryBot.build "user", username: "NAME"

# good - with `EnforcedStyle: symbol`
FactoryBot.create('user')
FactoryBot.build "user", username: "NAME"
FactoryBot.create(:user)
create(:user)

Configurable attributes

Name Default value Configurable values

Include

**/*_spec.rb, **/spec/**/*, **/test/**/*, **/features/support/factories/**/*.rb

Array

EnforcedStyle

symbol

symbol, string

ExplicitOnly

false

Boolean

FactoryBot/IdSequence

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

Yes

[next]

-

Do not create a FactoryBot sequence for an id column.

Examples

# 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

FactoryBot/RedundantFactoryOption

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

Yes

Yes

2.23

-

Checks for redundant factory option.

Examples

# bad
association :user, factory: :user

# good
association :user

Configurable attributes

Name Default value Configurable values

Include

**/*_spec.rb, **/spec/**/*, **/test/**/*, **/features/support/factories/**/*.rb

Array

FactoryBot/SyntaxMethods

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.

Safety

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

Examples

# bad
FactoryBot.create(:bar)
FactoryBot.build(:bar)
FactoryBot.attributes_for(:bar)

# good
create(:bar)
build(:bar)
attributes_for(:bar)

Configurable attributes

Name Default value Configurable values

Include

**/*_spec.rb, **/spec/**/*, **/test/**/*, **/features/support/factories/**/*.rb

Array