Bird
Raised Fist0
Ruby on Railsframework~5 mins

Fixture and factory usage in Ruby on Rails - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a fixture in Rails testing?
A fixture is a fixed set of sample data stored in YAML files that Rails loads into the test database before running tests. It helps tests run with known data.
Click to reveal answer
beginner
What is a factory in Rails testing?
A factory is a Ruby object that builds test data dynamically. It creates objects with default or customized attributes when tests run, often using Factory Bot.
Click to reveal answer
intermediate
How do fixtures and factories differ in flexibility?
Fixtures use static data loaded before tests, so they are less flexible. Factories create data on demand with customizable attributes, making them more flexible for varied test cases.
Click to reveal answer
beginner
How do you define a simple factory for a User model using Factory Bot?
You define it like this:
FactoryBot.define do
  factory :user do
    name { "Test User" }
    email { "user@example.com" }
  end
end
Click to reveal answer
intermediate
Why might you choose factories over fixtures in Rails tests?
Factories allow creating fresh, customized data for each test, reducing dependencies and making tests easier to maintain and understand. Fixtures can become brittle with static data.
Click to reveal answer
What file format do Rails fixtures use to store test data?
AYAML
BJSON
CXML
DCSV
Which gem is commonly used to create factories in Rails?
AFactory Bot
BPry
CCapybara
DRSpec
Which is a benefit of using factories over fixtures?
AStatic data for all tests
BFaster test runs always
CDynamic, customizable test data
DNo need to write any code
How do you access fixture data in a Rails test?
AUsing instance variables
BUsing fixture names as methods
CUsing FactoryBot.create
DUsing SQL queries
Which statement about fixtures is true?
AThey generate data at runtime dynamically
BThey cannot be used with Rails
CThey require Factory Bot to work
DThey are loaded once before tests run
Explain the difference between fixtures and factories in Rails testing.
Think about how test data is created and used.
You got /4 concepts.
    Describe how you would define and use a factory for a User model in a Rails test.
    Focus on the syntax and usage steps.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main difference between fixtures and factories in Rails testing?
      easy
      A. Fixtures use static YAML files, while factories generate data dynamically with Ruby code.
      B. Fixtures are faster to write than factories.
      C. Factories require no setup, but fixtures need database cleaning.
      D. Factories store data in YAML files, fixtures use Ruby code.

      Solution

      1. Step 1: Understand fixtures data source

        Fixtures load test data from static YAML files before tests run.
      2. Step 2: Understand factories data generation

        Factories create test data dynamically using Ruby code during test execution.
      3. Final Answer:

        Fixtures use static YAML files, while factories generate data dynamically with Ruby code. -> Option A
      4. Quick Check:

        Fixtures = YAML, Factories = Ruby code [OK]
      Hint: Fixtures = YAML files, factories = Ruby code [OK]
      Common Mistakes:
      • Confusing fixtures as dynamic data generators
      • Thinking factories use YAML files
      • Assuming fixtures are created with Ruby code
      2. Which of the following is the correct syntax to define a factory for a User model using FactoryBot?
      easy
      A. factory :user do name { "Alice" } end
      B. define_factory :user do name "Alice" end
      C. FactoryBot.define do factory :user do name { "Alice" } end end
      D. factory :user { name: "Alice" }

      Solution

      1. Step 1: Recognize FactoryBot syntax

        FactoryBot factories are defined inside a block passed to FactoryBot.define.
      2. Step 2: Check block and attribute syntax

        Attributes use curly braces with Ruby code, e.g., name { "Alice" }.
      3. Final Answer:

        FactoryBot.define do factory :user do name { "Alice" } end end -> Option C
      4. Quick Check:

        FactoryBot.define + block + attribute with braces [OK]
      Hint: FactoryBot.define block wraps factory definitions [OK]
      Common Mistakes:
      • Omitting FactoryBot.define block
      • Using wrong attribute syntax without braces
      • Using invalid factory syntax like curly braces for block
      3. Given the following factory and test code, what will user.name output?
      FactoryBot.define do
        factory :user do
          name { "Bob" }
        end
      end
      
      user = FactoryBot.create(:user)
      medium
      A. "Alice"
      B. nil
      C. Raises an error because name is missing
      D. "Bob"

      Solution

      1. Step 1: Understand factory attribute assignment

        The factory sets the name attribute to "Bob" using a block.
      2. Step 2: FactoryBot.create builds and saves user

        Calling create(:user) builds a user with name "Bob" and saves it.
      3. Final Answer:

        "Bob" -> Option D
      4. Quick Check:

        Factory attribute value = "Bob" [OK]
      Hint: Factory attribute blocks set values directly [OK]
      Common Mistakes:
      • Assuming default name is nil
      • Confusing create with build (create saves)
      • Expecting name to be "Alice" without definition
      4. You have a fixture file users.yml with a user named john. In your test, you write users(:john) but get an error. What is a likely cause?
      medium
      A. The test database is not migrated.
      B. The fixture file is not loaded or declared in the test setup.
      C. You must use FactoryBot.create instead of fixtures.
      D. The user named john is misspelled in the fixture file.

      Solution

      1. Step 1: Check fixture loading in test

        Fixtures must be declared or loaded for the test to access them.
      2. Step 2: Confirm fixture file presence and naming

        If the fixture file exists but is not loaded, users(:john) will raise an error.
      3. Final Answer:

        The fixture file is not loaded or declared in the test setup. -> Option B
      4. Quick Check:

        Fixtures must be loaded to use named references [OK]
      Hint: Load fixtures before using named references [OK]
      Common Mistakes:
      • Assuming misspelling without checking loading
      • Thinking FactoryBot is required instead of fixtures
      • Ignoring fixture loading setup in test
      5. You want to create multiple users with different emails using factories in a test. Which approach correctly creates 3 users with unique emails?
      hard
      A. factory :user do sequence(:email) { |n| "user#{n}@example.com" } end users = 3.times.map { FactoryBot.create(:user) }
      B. factory :user do email "user@example.com" end users = 3.times.map { FactoryBot.create(:user) }
      C. factory :user do email { "user@example.com" } end users = FactoryBot.create_list(:user, 3)
      D. factory :user do email { "user@example.com" } end users = FactoryBot.build(:user, 3)

      Solution

      1. Step 1: Understand sequence usage in factories

        Using sequence(:email) generates unique emails for each created user.
      2. Step 2: Confirm multiple user creation with unique emails

        Calling FactoryBot.create inside a loop with sequence ensures 3 users with different emails.
      3. Final Answer:

        factory :user do sequence(:email) { |n| "user#{n}@example.com" } end users = 3.times.map { FactoryBot.create(:user) } -> Option A
      4. Quick Check:

        Sequence + create loop = unique users [OK]
      Hint: Use sequence for unique attributes in factories [OK]
      Common Mistakes:
      • Using static email causing duplicates
      • Using build instead of create (no DB save)
      • Not using sequence for unique values
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard