This article is an orphan, as no other articles link to it. Please introduce links to this page from related articles; try the Find link tool for suggestions. (February 2018) |
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 # Specify 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(:name) {|n| "Title #{n}" } # 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) 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:
after(:build)
- Code can be injected after the factory is built
before(:create)
- Code can be injected before the factory is saved
after(:create)
- Code can be injected after the factory is saved
after(:stub)
- Code can be injected before the factory is stubbed
See also
Other Test libraries for Ruby
- NullDB: a way to speed up testing by avoiding database use.
- Fixture Builder: a tool that compiles Ruby factories into fixtures before a test run.
- Shoulda: an extension to test/unit with additional helpers, macros, and assertions.
- Rspec: a behavior-driven development framework
- Capybara: Acceptance test framework for web applications.
References
- "Project Naming History". github.com/thoughtbot/factory_bot.
- "Waiting For a FactoryGirl". Thoughtbot Blog.
- "Rails Testing". hiringthing.com.
- ^ "Getting Started". rubydoc.info/gems/factory_bot.
- "Traits". Thoughtbot Blog.