FactoryBot

FactoryBot/AssociationStyle

Enabled by default Safe Supports autocorrection Version Added Version Changed

Pending

No

Yes (Unsafe)

2.23

-

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

EnforcedStyle: explicit

# bad
factory :post do
  user
end

# good
factory :post do
  association :user
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

Include

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

Array

EnforcedStyle

implicit

explicit, implicit

NonImplicitAssociationMethodNames

<none>

FactoryBot/AttributeDefinedStatically

Enabled by default Safe Supports autocorrection Version Added Version Changed

Enabled

Yes

Yes

1.28

2.0

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 }

Configurable attributes

Name Default value Configurable values

Include

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

Array

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

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

2.23

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/**/*, spec/factories.rb, spec/factories/**/*.rb, 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

FactoryBot/FactoryClassName

Enabled by default Safe Supports autocorrection Version Added Version Changed

Enabled

Yes

Yes

1.37

2.0

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

Configurable attributes

Name Default value Configurable values

Include

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

Array

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

EnforcedStyle

symbol

symbol, string

ExplicitOnly

false

Boolean

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

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)