Laravel - 修改DB ::连接方法

时间:2017-10-11 18:42:03

标签: database laravel laravel-5 phpunit laravel-5.3

我想修改DB :: connection,所以如果我正在运行测试,它将覆盖给定的连接。

我在模型中有很多硬编码连接,比如这个DB :: connection('mysql2'),所以我想用mysql_testing覆盖mysql2连接。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我通常做的是添加phpunit.xml

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

然后在config/database.php中,我创建了mysql连接的副本,如下所示:

'mysql_testing' => [
    'driver' => 'mysql',
    'host' => env('DB_TESTING_HOST', 'localhost'),
    'database' => env('DB_TESTING_DATABASE', 'forge'),
    'username' => env('DB_TESTING_USERNAME', 'forge'),
    'password' => env('DB_TESTING_PASSWORD', ''),
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix' => '',
    'strict' => false,
],

然后在.env我定义测试连接设置:

#TESTING

DB_TESTING_HOST=127.0.0.1
DB_TESTING_DATABASE=test_database
DB_TESTING_USERNAME=root
DB_TESTING_PASSWORD=pass

它没有任何问题,如果你在同一台机器/同一目录中手动运行测试和测试应用程序,则不需要在.env中切换任何内容

修改

如果您遇到这种情况,可能修改多个模型并不是最好的方法,但如果您想使用相同的数据库,无论连接集如何,您都可以这样做:

假设您已设置环境以测试可以使用的方法:

<env name="APP_ENV" value="testing"/>

phpunit.xml文件中,您可以进入AppServiceProvider课程,register方法可以执行以下操作:

if ($this->app->environment('testing')) {
    $this->app['config']->set('database.connections.mysql2.database', 'yourcustom testing database');
    // ... 
    $this->app['config']->set('database.connections.mysql15.database', 'yourcustom testing database');
}

我没有尝试过,但它应该可行 - 它应该在运行测试时使你可以将所有连接设置为相同的测试数据库(如果你愿意,可以设置为其他数据库)