Bird
Raised Fist0
Laravelframework~20 mins

Database testing (RefreshDatabase) in Laravel - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Laravel Database Testing Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What happens when using RefreshDatabase trait in Laravel tests?
In Laravel, when you use the RefreshDatabase trait in your test class, what is the expected behavior regarding the database state before each test?
AThe database is migrated fresh before each test, ensuring a clean state.
BThe database is only migrated once before all tests run, then reused.
CThe database is not touched; tests run on the existing data.
DThe database is backed up before tests and restored after all tests finish.
Attempts:
2 left
💡 Hint
Think about how Laravel ensures tests don't affect each other with database changes.
❓ state_output
intermediate
2:00remaining
What is the database state after a test using RefreshDatabase completes?
If a Laravel test uses the RefreshDatabase trait and inserts a record during the test, what will be the state of the database after the test finishes?
AThe inserted record is removed; the database is reset to empty or migrated state.
BThe database is backed up with the inserted record for later use.
CThe database is partially reset, keeping some tables intact.
DThe inserted record remains in the database for the next test.
Attempts:
2 left
💡 Hint
Consider how RefreshDatabase affects test isolation.
📝 Syntax
advanced
2:00remaining
Identify the correct way to use RefreshDatabase in a Laravel test class
Which of the following code snippets correctly applies the RefreshDatabase trait in a Laravel test class?
Aclass UserTest extends TestCase { public function testExample() { use RefreshDatabase; /* test code */ } }
Bclass UserTest extends TestCase { use RefreshDatabase; public function testExample() { /* test code */ } }
Cclass UserTest extends TestCase { public function testExample() { RefreshDatabase(); /* test code */ } }
Dclass UserTest extends TestCase { use RefreshDatabase(); public function testExample() { /* test code */ } }
Attempts:
2 left
💡 Hint
Remember how traits are included in PHP classes.
🔧 Debug
advanced
2:00remaining
Why does the database not reset between tests despite using RefreshDatabase?
You have a Laravel test class using the RefreshDatabase trait, but data inserted in one test remains in the next test. What is the most likely cause?
AThe migrations are not defined in the <code>database/migrations</code> folder.
BThe <code>RefreshDatabase</code> trait is used inside a test method instead of the class.
CThe database connection is set to an in-memory SQLite database.
DThe test class extends <code>PHPUnitFrameworkTestCase</code> instead of <code>TestsTestCase</code>.
Attempts:
2 left
💡 Hint
Think about the base class that sets up Laravel's testing environment.
🧠 Conceptual
expert
3:00remaining
Why might you choose RefreshDatabase over DatabaseTransactions in Laravel tests?
Both RefreshDatabase and DatabaseTransactions traits reset the database state between tests. What is a key reason to prefer RefreshDatabase in some cases?
A<code>DatabaseTransactions</code> cannot be used with any Laravel model factories.
B<code>RefreshDatabase</code> is faster because it uses transactions instead of migrations.
C<code>RefreshDatabase</code> runs migrations fresh, supporting tests that modify schema or use multiple database connections.
D<code>DatabaseTransactions</code> permanently deletes data, while <code>RefreshDatabase</code> only rolls back.
Attempts:
2 left
💡 Hint
Think about schema changes and database connection types.

Practice

(1/5)
1. What is the main purpose of using the RefreshDatabase trait in Laravel tests?
easy
A. To seed the database with test data before tests run
B. To speed up tests by skipping database migrations
C. To reset the database after each test to ensure a clean state
D. To backup the database before running tests

Solution

  1. Step 1: Understand the role of RefreshDatabase

    The trait resets the database by running migrations fresh for each test.
  2. Step 2: Identify why resetting is important

    Resetting ensures tests do not affect each other by leftover data.
  3. Final Answer:

    To reset the database after each test to ensure a clean state -> Option C
  4. Quick Check:

    Database reset = Clean test state [OK]
Hint: Remember: RefreshDatabase cleans database for every test [OK]
Common Mistakes:
  • Thinking it seeds data automatically
  • Confusing it with speeding up tests
  • Assuming it backs up data
2. Which of the following is the correct way to use RefreshDatabase in a Laravel test class?
easy
A. class ExampleTest extends TestCase { implements RefreshDatabase }
B. class ExampleTest extends TestCase { RefreshDatabase(); }
C. class ExampleTest extends TestCase { @RefreshDatabase }
D. class ExampleTest extends TestCase { use RefreshDatabase; }

Solution

  1. Step 1: Recall trait usage syntax in PHP

    Traits are included using the use keyword inside the class body.
  2. Step 2: Match syntax with options

    Only class ExampleTest extends TestCase { use RefreshDatabase; } correctly uses use RefreshDatabase; inside the class.
  3. Final Answer:

    class ExampleTest extends TestCase { use RefreshDatabase; } -> Option D
  4. Quick Check:

    Traits use use keyword inside class [OK]
Hint: Traits use 'use' keyword inside class body [OK]
Common Mistakes:
  • Using parentheses like a method call
  • Using annotations instead of traits
  • Trying to implement traits as interfaces
3. Given this Laravel test code snippet using RefreshDatabase:
public function test_user_creation() {
    User::factory()->create(['name' => 'Alice']);
    $this->assertDatabaseHas('users', ['name' => 'Alice']);
}
What will happen if you run this test twice in a row?
medium
A. Both tests pass because the database is reset each time
B. The second test fails due to duplicate user entries
C. Both tests fail because the database is not migrated
D. The first test passes, second test errors out with connection issue

Solution

  1. Step 1: Understand RefreshDatabase effect

    It resets the database before each test, so no leftover data remains.
  2. Step 2: Analyze test behavior on repeated runs

    Each test run starts fresh, so creating 'Alice' user and asserting passes every time.
  3. Final Answer:

    Both tests pass because the database is reset each time -> Option A
  4. Quick Check:

    Database reset = independent test runs [OK]
Hint: RefreshDatabase resets DB so repeated tests stay clean [OK]
Common Mistakes:
  • Assuming data persists between tests
  • Thinking duplicate entries cause failure
  • Confusing RefreshDatabase with no migration
4. You wrote a Laravel test using RefreshDatabase but the database is not resetting between tests. What is the most likely cause?
medium
A. You did not call migrate:fresh manually before tests
B. You forgot to add use RefreshDatabase; trait in your test class
C. You used RefreshDatabase but did not seed the database
D. You ran tests without the --database option

Solution

  1. Step 1: Check trait usage in test class

    Without adding use RefreshDatabase;, the trait's reset logic won't run.
  2. Step 2: Understand that manual migration commands are not needed

    The trait handles migrations automatically; manual commands are unnecessary.
  3. Final Answer:

    You forgot to add use RefreshDatabase; trait in your test class -> Option B
  4. Quick Check:

    Trait must be included to reset DB [OK]
Hint: Always add trait with 'use RefreshDatabase;' inside test class [OK]
Common Mistakes:
  • Thinking manual migration commands are required
  • Confusing seeding with resetting
  • Assuming command line options affect trait behavior
5. You want to write a Laravel test that uses RefreshDatabase but also seeds some initial data before each test. Which approach is correct?
hard
A. Use RefreshDatabase trait and call $this->seed() in the test's setUp() method
B. Use RefreshDatabase trait and add seeder class name as a parameter to the trait
C. Manually run php artisan migrate:fresh --seed before running tests
D. Use RefreshDatabase trait and override the refreshDatabase() method to seed

Solution

  1. Step 1: Understand how to seed with RefreshDatabase

    The trait resets the database, but seeding must be triggered manually in tests.
  2. Step 2: Use $this->seed() in setUp() method

    This ensures seeding runs before each test after database reset.
  3. Final Answer:

    Use RefreshDatabase trait and call $this->seed() in the test's setUp() method -> Option A
  4. Quick Check:

    Seed manually after refresh in setUp() [OK]
Hint: Call $this->seed() in setUp() when using RefreshDatabase [OK]
Common Mistakes:
  • Trying to pass seeder to trait directly
  • Running artisan commands manually during tests
  • Overriding trait methods unnecessarily