Laravel 5:处理多个连接和测试

Fel*_*eña 8 phpunit laravel eloquent laravel-5

我有一个Laravel 5.4应用程序,它的模型指向不同的数据库连接.

例如,我User指向一个MySQL数据库,然后Company指向一个PostgreSQL数据库(使用该$connection变量).

现在,当我运行PHPUnit时,我希望将$connection变量替换为phpunit.xml文件中指定的内容,这是内存类型数据库中的SQLite.

这怎么可以实现?

Ron*_*den 4

大多数答案都是更改生产代码,我不喜欢这一点。

既然\Illuminate\Contracts\Foundation\Application在您的测试中可用,我们就使用它吧!

<?php

declare(strict_types=1);

namespace Tests\Feature;

use Tests\TestCase;
use App\Models\Company;    

class CompanyFeatureTest extends TestCase
{
    /**
     * @return void
     */
    protected function setUp(): void
    {
        parent::setUp();

        $this->app->bind(Company::class, function () {
            return (new Company())->setConnection(config('database.default'));
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

每当您的Company班级被调用时,我们都会返回一个经过操作的班级。
在这一项中,我们改变了$connection属性。

如果您的 中有以下内容phpunit.xml

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

config('database.default')的值为sqlite

有关绑定的更多信息可以在这里找到:https ://laravel.com/docs/5.8/container#binding