How to seed database migrations for laravel tests? How to seed database migrations for laravel tests? php php

How to seed database migrations for laravel tests?


All you need to do is make an artisan call db:seed in the setUp function

<?phpuse Illuminate\Foundation\Testing\DatabaseMigrations;class ExampleTest extends TestCase{    use DatabaseMigrations;    public function setUp(): void    {        parent::setUp();        // seed the database        $this->artisan('db:seed');        // alternatively you can call        // $this->seed();    }    /**     * A basic functional test example.     *     * @return void     */    public function testBasicExample()    {        $response = $this->get('/');        // ...    }}

ref: https://laravel.com/docs/5.6/testing#creating-and-running-tests


It took me some digging to figure this out, so I thought I'd share.

If you look at the source code for the DatabaseMigrations trait, then you'll see it has one function runDatabaseMigrations that's invoked by setUp which runs before every test and registers a callback to be run on teardown.

You can sort of "extend" the trait by aliasing that function, re-declare a new function with your logic in it (artisan db:seed) under the original name, and call the alias inside it.

use Illuminate\Foundation\Testing\DatabaseMigrations;class ExampleTest extends TestCase{    use DatabaseMigrations {        runDatabaseMigrations as baseRunDatabaseMigrations;    }    /**     * Define hooks to migrate the database before and after each test.     *     * @return void     */    public function runDatabaseMigrations()    {        $this->baseRunDatabaseMigrations();        $this->artisan('db:seed');    }    /**     * A basic functional test example.     *     * @return void     */    public function testBasicExample()    {        $response = $this->get('/');        // ...    }}


I know this question has already been answered several times, but I didn't see this particular answer so I thought I'd throw it in.

For a while in laravel (at least since v5.5), there's been a method in the TestCase class specifically used for calling a database seeder:

https://laravel.com/api/5.7/Illuminate/Foundation/Testing/TestCase.html#method_seed

with this method, you just need to call $this->seed('MySeederName'); to fire the seeder.

So if you want this seeder to fire before every test, you can add the following setUp function to your test class:

public function setUp(){    parent::setUp();    $this->seed('MySeederName');}

The end result is the same as:

 $this->artisan('db:seed',['--class' => 'MySeederName'])

or

Artisan::call('db:seed', ['--class' => 'MySeederName'])

But the syntax is a bit cleaner (in my opinion).