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

les*_*gar 23 php unit-testing laravel laravel-5

我正在尝试在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'   => '',
],
*/
Run Code Online (Sandbox Code Playgroud)

我们可能会用这个 :)

有没有办法在全球范围内为所有测试设置?我是否需要在每个测试用例中设置connecton?

任何帮助赞赏.

Fab*_*nes 34

实际上它很简单.

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

'sqlite' => [
    'driver'   => 'sqlite',
    'database' => storage_path('database.sqlite'),
    'prefix'   => '',
],
Run Code Online (Sandbox Code Playgroud)

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

php artisan migrate --database=sqlite
Run Code Online (Sandbox Code Playgroud)

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

DB_CONNECTION=sqlite
Run Code Online (Sandbox Code Playgroud)

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

//config/database.php file
'default' => env('DB_CONNECTION', 'mysql'),
Run Code Online (Sandbox Code Playgroud)

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

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

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

<env name="DB_CONNECTION" value="sqlite"/>
Run Code Online (Sandbox Code Playgroud)

现在您的应用程序正在使用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');
    }
}
Run Code Online (Sandbox Code Playgroud)

无论您在文件上还是在迁移命令中指定,迁移都将始终在连接管理上运行.env


cw2*_*w24 8

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

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

'default' => env('DB_CONNECTION', 'mysql'),

...

'testing' => [
    'driver' => 'sqlite',
    'database' => ':memory:',
    'prefix' => '',
],
Run Code Online (Sandbox Code Playgroud)

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

<env name="DB_CONNECTION" value="testing"/>
Run Code Online (Sandbox Code Playgroud)

我保持.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>
Run Code Online (Sandbox Code Playgroud)