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

2022-08-30 16:01:41

我正在尝试在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'   => '',
],
*/

我们可能会使用此:)

有没有办法为所有测试全局设置此设置?是否需要在每个测试用例中设置连接?

任何帮助赞赏。


答案 1

实际上,这很简单。

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

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

您有两种选择,要么编辑您的,要么只指定要在其中运行迁移的数据库的名称:.env

php artisan migrate --database=sqlite

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

DB_CONNECTION=sqlite

这是因为当文件中缺少此变量时,Laravel默认为MySQL:.env

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

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

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

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

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

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

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

附言

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

<?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


答案 2

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

首先,我更改默认值,然后向数据库添加新连接.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>

推荐