Factory Bot (Rails Testing)


Factory Bot, originally known as Factory Girl, is a software library for the Ruby programming language that provides factory methods to create test fixtures for automated software testing. The fixture objects can be created on the fly; they may be plain Ruby objects with a predefined state, ORM objects with existing database records or mock objects.
Factory Bot is often used in testing Ruby on Rails applications; where it replaces Rails' built-in fixture mechanism. Rails' default setup uses a pre-populated database as test fixtures, which are global for the complete test suite. Factory Bot, on the other hand, allows developers to define a different setup for each test and thus helps to avoid dependencies within the test suite.

Factories

Defining Factories

A factory is defined by a name and its set of attributes. The class of the test object is either determined through the name of the factory or set explicitly.

FactoryBot.define do
# Determine class automatically
factory :user do
name = "Captain Minion"
superhero false
end

# Specific class explicitly
factory :superhero, class: User do
name = "Tony Stark"
superhero true
end
end

Features

Traits

Traits allow grouping of attributes which can be applied to any factory.

factory :status do
title "Seeking for Full Time jobs"
trait :international do
international true
end
trait :resident do
international false
end
trait :comp_sci do
comp_sci true
end
trait :electrical do
comp_sci false
end

factory :comp_sci_international_student, traits:
factory :electrical_resident_student, traits:
end

Alias

Factory Bot allows creating aliases for existing factories so that the factories can be reused.

factory :user, aliases: do
first_name "John"
end
factory :notice do
teacher
# Alias used teacher for user
title "Office Hours"
end
factory :notification do
student
#Alias used student for user
title "Lecture timings"
end

Sequences

Factory Bot allows creating unique values for a test attribute in a given format.

FactoryBot.define do
factory :title do
sequence
# Title 1, Title 2 and so on...
end
end

Inheritance

Factories can be inherited while creating a factory for a class. This allows the user to reuse common attributes from parent factories and avoid writing duplicate code for duplicate attributes. Factories can be written in a nested fashion to leverage inheritance.

factory :user do
name "Micheal"
factory :admin do
admin_rights true
end
end
admin_user = create
admin_user.name # Micheal
admin_user.admin_rights # true

Parent factories can also be specified explicitly.

factory :user do
name "Micheal"
end
factory :admin, parent: :user do
admin_user true
end

Callback

Factory Bot allows custom code to be injected at four different stages:
;: Code can be injected after the factory is built
;: Code can be injected before the factory is saved
;: Code can be injected after the factory is saved
;: Code can be injected before the factory is stubbed

Other Test libraries for Ruby