我正在尝试使用sqlite数据库进行测试,因为我不想触摸我的实际数据库:
在我的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
在我的TestCase.php文件中,我有一个函数可以重置并迁移并播种数据库进行测试:
Artisan::call('migrate:reset');
Artisan::call('migrate');
Artisan::call('db:seed');
我还将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' => ''
],
]
];
我可以验证是否正在读取database.php文件,但是某些东西仍然阻止了sqlite的使用,我仍然最终收回了我的REAL数据库(MySQL)。如何强制Laravel / Codeception使用我的测试数据库?
答案 0 :(得分:5)
稍微搜索之后,我们假设在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>
但是我想使用.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;
}
答案 1 :(得分:4)
TL; DR:
APP_ENV=testing php artisan serve
如果你运行&#34; php artisan help&#34;你会看到:
--env[=ENV] The environment the command should run under.
if(!empty($ argv)&amp;&amp; in_array(&#39; - env = testing&#39;,$ argv)){ $ APP-&GT; loadEnvironmentFrom(&#39; .env.testing&#39); }
然后你可以用&#34; php artisan serve --env = testing&#34;
启动你的服务器这是一种解决方法,我希望很快Laravel的某个人能够确定正确的方法。
击>更新:这种方式不那么混乱:
APP_ENV=testing php artisan serve
然后:
if (getenv('APP_ENV') === 'testing') {
$app->loadEnvironmentFrom('.env.testing');
}
更新2:您似乎不需要5.2中的上述条件,或者可能永远不需要?
答案 2 :(得分:2)
所以我厌倦了,决定做这个hacky的事情:
在.env中我添加了这个:
DB_DEFAULT=mysql
然后我将我的sqlite_testing配置添加到database.php文件中,我改变了默认设置,如下所示:
'default' => env('DB_DEFAULT', 'mysql'),
最后,我将其添加到TestCase.php的开头:
putenv('DB_DEFAULT=sqlite_testing');
我坚持这个因为它确实有效,但任何评论/建议都值得赞赏。我在laracasts网站上找到了这个解决方案:
https://laracasts.com/discuss/channels/testing/how-to-specify-a-testing-database-in-laravel-5
答案 3 :(得分:2)
在项目根目录的codeception.yml文件中(参见https://codeception.com/docs/06-ModulesAndHelpers#Dynamic-Configuration-With-Parameters的文档),检查params的值,应该是类似下面的内容
params:
- .env.testing
答案 4 :(得分:0)
我为此目的使用tests/_bootstrap.php
:
<?php
// This is global bootstrap for autoloading
putenv('MY_ENV_NAME=my_env_valye');