When you're testing your Laravel application particularly with functional tests there will be times where you need to test database interactions, such as if you testing the form posting you'll need to make sure you can also do a GET on this table to the new data back out. The problem you get is if you have this in your unit tests then you could slowly populate your dev database with all this data from your unit tests. In this tutorial, we're going to learn how you can create a database.sqlite file to use for your test database.
To create a new test database connection all you have to do is add a new connection to the database confile file config/database.php
.
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => database_path('database.sqlite'),
'prefix' => '',
],
Add testing specific environment variable changes in the phpunit.xml
. Here you can override any of the environment variables, were going to change - APP_ENV - Settings for environment name
CACHE_DRIVER - Method of caching
SESSION_DRIVER - Method of session
QUEUE_DRIVER - Method for queue
DB_CONNECTION - Database connection same name as testing database
DB_DATABASE - Method of database type
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
You can use artisan to create a new command, we're going to create one that will setup the test database sqlite file for us. Run the following command on the commandline.
php artisan make:command MakeTestDb
You'll notice there will be a new file in App\Console\Commands
. Open this class and replace it with the code below.
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Contracts\Filesystem\Factory;
class MakeTestDb extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'testdb:make';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Make test db';
/**
* @var \Illuminate\Contracts\Filesystem\Filesystem
*/
private $fileSystem;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct(Factory $storage)
{
parent::__construct();
$this->fileSystem = $storage->disk('database');
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
//
$this->fileSystem->put('database.sqlite', '');
$this->call('migrate', [
'--database' => 'sqlite'
]);
}
}
You can now use the command php artisan testdb:make
which will create a new file called database.sqlite and run the migration command on this file. Now when you run your unit tests the data will be stored in a sqlite file and not your dev database.