我正在尝试在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>