选项 1
如何使用迁移和种子设置数据库,然后使用数据库事务? (https://laravel.com/docs/5.1/testing#resetting-the-database-after-each-test)
我希望能够像这样通过工匠设置我的测试数据库:
$ php artisan migrate --database=mysql_testing
$ php artisan db:seed --database=mysql_testing
你可以猜到,我使用的是 mysql,但我不明白为什么这不适用于 sqlite。
我就是这样做的。
config/database.php
首先将测试数据库信息添加到您的 config/database.php 文件中,在您当前的数据库信息下。
'connections' => [
'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,
],
'mysql_testing' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_TEST_DATABASE'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
],
如果您这样做,请不要忘记将 DB_TEST_DATABASE 添加到您的 .env 文件中:
DB_DATABASE=abc
DB_TEST_DATABASE=abc_test
phpunit.xml
phpunit.xml 文件中设置的任何值,覆盖 .env 文件中给出的值。所以我们告诉phpunit使用“mysql_testing”数据库连接而不是“mysql”数据库连接。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit>
...
<php>
...
<env name="DB_CONNECTION" value="mysql_testing"/>
</php>
测试类
我的测试类如下所示:
class MyTest extends \TestCase
{
use \Illuminate\Foundation\Testing\DatabaseTransactions;
public function testSomething()
{
选项 2
这里的数据库在每次测试之前都会重置,这就是我更喜欢选项 1 的原因。但你也许可以让它以你喜欢的方式工作。
我之前尝试过一次,它可能对你有用。
测试/TestCase.php
扩展测试用例,加载一个新的 .env 文件,.env.testing
<?php
class TestCase extends Illuminate\Foundation\Testing\TestCase
{
/**
* The base URL to use while testing the application.
*
* @var string
*/
protected $baseUrl = 'http://localhost';
/**
* Creates the application.
*
* @return \Illuminate\Foundation\Application
*/
public function createApplication()
{
/** @var $app \Illuminate\Foundation\Application */
$app = require __DIR__.'/../bootstrap/app.php';
$app->loadEnvironmentFrom('.env.testing');
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
return $app;
}
}
.env.testing
创建这个新的 .env 文件并添加数据库详细信息
APP_ENV=testing
APP_DEBUG=true
APP_KEY=xxx
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=abc_testing
DB_USERNAME=xxx
DB_PASSWORD=xxx
在测试类中:
使用 PDO 删除并重新创建数据库 - 比尝试截断所有内容更容易。
然后使用 artisan 迁移和播种数据库。
class MyTest extends TestCase
{
public static function setUpBeforeClass()
{
$config = parse_ini_file(".env.testing");
$username = $config['DB_USERNAME'];
$password = $config['DB_PASSWORD'];
$database = $config['DB_DATABASE'];
$host = $config['DB_HOST'];
// Create test database
$connection = new PDO("mysql:host={$host}", $username, $password);
$connection->query("DROP DATABASE IF EXISTS " . $database);
$connection->query("CREATE DATABASE " . $database);
}
public function testHomePage()
{
Artisan::call('migrate');
Artisan::call('db:seed');
$this->visit('/')
->see('Home')
->see('Please sign in')
->dontSee('Logout');
}