How to specify a testing database in Laravel 5?
I'm trying to write unit tests for my models and controllers. I know that Laravel sets the environment to "testing" by default, but I can't figure out where to specify the test database name so it's not version controlled.
I can change the database name in phpunit.xml, but that file is commited:
<env name="DB_DATABASE" value="test_db"/>
Ideally, I'd like it to work like the .env file. .env.test maybe, that is used for unit testing?
Any help and advice are appreciated.
Thank you @blackbird and @JoeDawson. I've switched from default PHPUnit to Codeception. Using Laravel5 module for specifying a testing .env file works perfectly.
Here's what I ended up using for my unit tests. Well, technically some of them are integration tests, since the database is used, but anyway.
Here's a snippet of my config/database.php file:
<?php
return [
// other stuff
'default' => env('DB_DEFAULT', 'mysql'),
'connections' => [
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
],
// other stuff
];
I'm using the sqlite database in memory which is a lot faster. You can't use it in functional or acceptance tests though.
And now a snippet of my tests/unit/TestCase.php. I set up the DB_DEFAULT variable which switches the database driver for each test. That way, I can run my unit/integration tests without having a separate .env.unit file.
<?php namespace UnitTests;
use Illuminate\Support\Facades\Artisan;
class TestCase extends \Illuminate\Foundation\Testing\TestCase
{
/**
* Creates the application.
*
* @return \Illuminate\Foundation\Application
*/
public function createApplication()
{
putenv('DB_DEFAULT=sqlite_testing');
$app = require __DIR__ . '/../../bootstrap/app.php';
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
return $app;
}
public function setUp()
{
parent::setUp();
Artisan::call('migrate');
}
public function tearDown()
{
Artisan::call('migrate:reset');
parent::tearDown();
}
}
Final note. As of this moment, running composer require "codeception/codeception:*" will get you the version 2.0.11. Running functional tests with Laravel 5 module will through a fatal error.
https://github.com/Codeception/Codeception/pull/1756
That will be fixed in 2.0.12, but for now you can install the latest dev version:
composer require "codeception/codeception": "2.0.*@dev"
Please or to participate in this conversation.