Joe*_*nks 4 laravel codeception
我试图使用sqlite db进行测试,因为我不想触摸我的实际数据库:
在我的unit.suite.yml文件中:
class_name: UnitTester
modules:
enabled: [Asserts, UnitHelper]
config:
Db:
dsn: 'sqlite:app/tests/_data/testdb.sqlite'
user: ''
password: ''
dump: app/tests/_data/dump.sql
Run Code Online (Sandbox Code Playgroud)
在我的TestCase.php文件中,我有一个函数可以重置和迁移并为db进行种子测试:
Artisan::call('migrate:reset');
Artisan::call('migrate');
Artisan::call('db:seed');
Run Code Online (Sandbox Code Playgroud)
我还将sqlite设置添加到app/config/testing/database.php:
<?php
// Codeception testing environment uses SQLITE
return [
'default' => 'sqlite',
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => 'app/tests/_data/testdb.sqlite',
'prefix' => ''
],
]
];
Run Code Online (Sandbox Code Playgroud)
我可以验证是否正在读取database.php文件,但是某些东西仍然阻止了sqlite的使用,我仍然最终收回了我的REAL数据库(MySQL).如何强制Laravel/Codeception使用我的测试数据库?
长话短说:
APP_ENV=testing php artisan serve
Run Code Online (Sandbox Code Playgroud)
如果你运行“php artisan help”你会看到:
--env[=ENV] The environment the command should run under.
Run Code Online (Sandbox Code Playgroud)
if (!empty($argv) && in_array('--env=testing', $argv)) { $app->loadEnvironmentFrom('.env.testing'); }
然后你可以使用“php artisanserve --env=testing”启动你的服务器
这是一种解决方法,我希望 Laravel 的人很快就能定义正确的方法来做到这一点。
更新:这种方式不太混乱:
APP_ENV=testing php artisan serve
Run Code Online (Sandbox Code Playgroud)
进而:
if (getenv('APP_ENV') === 'testing') {
$app->loadEnvironmentFrom('.env.testing');
}
Run Code Online (Sandbox Code Playgroud)
更新2:看来你不需要5.2中的上述条件,或者可能永远不需要?
在搜索了一下后,我们假设在phpunit.xml中包含变量.有一些预先包含的
<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"/>
</php>
Run Code Online (Sandbox Code Playgroud)
但是我想使用.env文件.所以总有办法:)
您现在需要做的就是使用正确的env文件调用应用程序loadEnvironmentFrom($ file).由于我只需要它进行测试,我添加了.env.testing.example和.env.testing(从git中排除).我在/tests/TestCase.php中添加了对方法的调用
public function createApplication()
{
$app = require __DIR__.'/../bootstrap/app.php';
//THIS IS IT :)
$app->loadEnvironmentFrom('.env.testing');
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
return $app;
}
Run Code Online (Sandbox Code Playgroud)
所以我厌倦了并决定做这件事:
在 .env 中我添加了这个:
DB_DEFAULT=mysql
Run Code Online (Sandbox Code Playgroud)
然后我将 sqlite_testing 配置添加到 database.php 文件中,并更改了默认设置,如下所示:
'default' => env('DB_DEFAULT', 'mysql'),
Run Code Online (Sandbox Code Playgroud)
最后,我将其添加到 TestCase.php 的开头:
putenv('DB_DEFAULT=sqlite_testing');
Run Code Online (Sandbox Code Playgroud)
我坚持这样做是因为它确实有效,但任何评论/建议都会受到赞赏。我在 laracasts 网站上找到了这个解决方案:
https://laracasts.com/discuss/channels/testing/how-to-specify-a-testing-database-in-laravel-5
| 归档时间: |
|
| 查看次数: |
6128 次 |
| 最近记录: |