Laravel Phpunit How To Use Diffent Migrations For Tests
I am trying to set up tests in Laravel, but I want to run different migrations from those that usually run.
The migrations that I run to initiate the database imports data from a production environment.
For testing I want to use a different database called "test", and I want to fill this test database with test data, not production data.
I added a "testing" connection to config/database.php
which uses the "test" database:
'connections' => [
'mysql' => [
'database' => env('DB_DATABASE', 'forge'),
...
],
'testing' => [
'database' => 'test',
...
],
],
And I setup phpunit.xml
to use this "testing" connection:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit ...>
...
<php>
<env name="DB_CONNECTION" value="testing"/>
...
</php>
</phpunit>
Now I want to initialize this "test" database with test data, using migrations from a different folder than the default.
I can use the normal migrations like this:
<?php
namespace Tests;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
abstract class TestCase extends BaseTestCase
{
use DatabaseMigrations;
public function setUp(): void
{
parent::setUp();
$this->seed();
}
}
But this uses the default folder database/migrations
.
I would like to put the testing migrations in folder tests/database/migrations
.
Is there a way to let use DatabaseMigrations;
use migrations from another folder?
Answer
You might need to override runDatabaseMigrations
method in DatabaseMigrations
trait and set the app's database path from there before your migrations run.
The runDatabaseMigrations
method might end up looking like this:
use DatabaseMigrations { runDatabaseMigrations as runMigration; }
public function runDatabaseMigrations()
{
$this->app->useDatabasePath(base_path('tests/database')); //example path
// dump($this->app->databasePath());
$this->runMigration();
}
Or you can set in the boot
method of your AppService provider:
if (config('app.env') === 'testing') { //Laravel automatically set env to 'testing' when running test
$this->app->useDatabasePath(base_path('tests/database'));
}
The migration will look for a sub-folder of 'tests/database' called "migrations".
PS: There will be side effect to this if you're have some other code or folder in the default
database
folder. Example, your factory class there will not be found for this test class.
Related Questions
- → "failed to open stream" error when executing "migrate:make"
- → October CMS Plugin Routes.php not registering
- → OctoberCMS Migrate Table
- → OctoberCMS Rain User plugin not working or redirecting
- → October CMS Custom Mail Layout
- → October CMS - How to correctly route
- → October CMS create a multi select Form field
- → October CMS - Conditionally Load a Different Page
- → How to disable assets combining on development in OctoberCMS
- → October CMS - Radio Button Ajax Click Twice in a Row Causes Content to disappear
- → OctoberCms component: How to display all ID(items) instead of sorting only one ID?
- → In OctoberCMS how do you find the hint path?
- → How to register middlewares in OctoberCMS plugin?