在Laravel 5.1中将SQLite设置为单元测试的数据库


Set SQLite as database for unit testing in Laravel 5.1

我正在尝试在Laravel 5.1中设置单元测试。根据文档我看到的是:

Laravel的建造考虑到了测试。事实上,支持测试带有PHPUnit的是开箱即用

运行测试时,Laravel将自动设置配置测试环境。Laravel自动配置会话并在测试时缓存到阵列驱动程序,这意味着没有会话或缓存数据将在测试时持久化。

这太棒了。但是运行测试时,如何告诉Laravel使用SQLite数据库连接

config/database.php中只有以下注释代码:

/* We might use this connection for unit tests
'sqlite' => [
    'driver'   => 'sqlite',
    'database' => storage_path().'/database.sqlite',
    'prefix'   => '',
],
*/

我们可能会使用这个:)

有没有一种方法可以在全局范围内为所有测试设置此项?我需要在每个测试用例中设置连接吗?

感谢您的帮助。

实际上它非常简单。

storage/文件夹上创建一个名为database.sqlite的测试数据库,或者如果您想要其他名称或位置,则必须更改config/database.php文件上的配置,这些是默认配置:

'sqlite' => [
    'driver'   => 'sqlite',
    'database' => storage_path('database.sqlite'),
    'prefix'   => '',
],

您有两个选项,要么编辑.env,要么只指定要运行迁移的数据库的名称:

php artisan migrate --database=sqlite

如果您喜欢编辑.env文件,那么我们必须添加一个新变量:

DB_CONNECTION=sqlite

这是因为当.env文件中没有这个变量时,Laravel默认为MySQL:

//config/database.php file
'default' => env('DB_CONNECTION', 'mysql'),

既然我们的应用程序指向了我们的sqlite数据库,我们现在可以运行迁移和播种了。之后,如果您只想继续运行MySQL,请从.env文件中删除DB_CONNECTION=sqlite

现在您已经在测试数据库上进行了迁移,最后一步就是指定SQLite作为测试的默认数据库。

在根文件夹上,您有一个phpunit.xml文件,打开它,在<php>节点下有一个新变量:

<env name="DB_CONNECTION" value="sqlite"/>

现在您的应用程序正在使用MySQL,phpunit正在使用SQLite。

请记住如果您更改.env以将其更改回默认数据库;

PS

运行迁移时要小心,如果您在迁移本身上指定了一个连接,它会尝试在该连接上运行。

<?php
use Illuminate'Database'Schema'Blueprint;
use Illuminate'Database'Migrations'Migration;
class AdminUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::connection('manage')->create('admin_users', function (Blueprint $t) {
            $t->increments('id');
            $t->string('name');
            $t->softDeletes();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::connection('manage')->dropIfExists('admin_users');
    }
}

无论您在.env文件或迁移命令中指定了什么,此迁移都将始终在连接manage上运行

我有一个不同的解决方案。我使用的是内存中的sqlite数据库。

首先我更改了默认值,然后在配置中添加一个到database.php的新连接

'default' => env('DB_CONNECTION', 'mysql'),
...
'testing' => [
    'driver' => 'sqlite',
    'database' => ':memory:',
    'prefix' => '',
],

然后我将以下行添加到phpunit.xml

<env name="DB_CONNECTION" value="testing"/>

我不动.env文件。这样,数据库连接将默认为"mysql"


以下是完整的phpunit.xml以获得更清晰的

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
     backupStaticAttributes="false"
     bootstrap="bootstrap/autoload.php"
     colors="true"
     convertErrorsToExceptions="true"
     convertNoticesToExceptions="true"
     convertWarningsToExceptions="true"
     processIsolation="false"
     stopOnFailure="false"
     syntaxCheck="false">
<testsuites>
    <testsuite name="Application Test Suite">
        <directory>./tests/</directory>
    </testsuite>
</testsuites>
<filter>
    <whitelist>
        <directory suffix=".php">app/</directory>
    </whitelist>
</filter>
<logging>
    <log type="coverage-html" target="./report/" charset="UTF-8"
         yui="true" highlight="false" 
         lowUpperBound="50" highLowerBound="80"/>
</logging>    
<php>
    <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="testing"/>
</php>
</phpunit>