Фикстуры плодят параллельные подключения к БД

Всё про тестирование в Yii 2.0
Ответить
SindBad
Сообщения: 71
Зарегистрирован: 2015.06.18, 10:53

Фикстуры плодят параллельные подключения к БД

Сообщение SindBad » 2018.04.27, 11:57

Всем здравия!
Привожу пример теста:

Код: Выделить всё

class ServiceTest extends \Codeception\Test\Unit
{

    protected $tester;

    protected function loadFixture()
    {
        $this->tester->haveFixtures(['user' => ['class' => UserFixture::class]]);
    }

    protected function unLoadFixture()
    {
        $this->tester->grabFixture('user')->db->close();
    }

    public function testSuccessSignin()
    {
        $this->loadFixture();
        $form   = new SigninForm([
            'email'    => 'brady.renner@rutherford.com',
            'password' => '123456',
        ]);
        $result = Service::signin($form, new \yii\web\User([
            'identityClass' => Identity::class,
        ]));
        $this->assertTrue($result);
        $this->unLoadFixture();
    }
}
Есть подозрение, что db->close() не срабатывает, так как show processlist во время отработки тестов показывает несколько десятков "висяков". Как правильно "прибраться" в данном случае?
Не хотелось бы ковыряться в MySQL, а хотелось бы сделать тест, работающий везде без танцев.

SindBad
Сообщения: 71
Зарегистрирован: 2015.06.18, 10:53

Re: Фикстуры плодят параллельные подключения к БД

Сообщение SindBad » 2018.04.27, 22:07

Проблему решил таки с PDO::ATTR_PERSISTENT => true, добавив в конфигурацию модуля Yii2 строку transaction: false.

Итак, решение полностью:
1) В config/test.php искомого приложения редактируем параметры подключения к бд (компонент db).
Например:

Код: Выделить всё

<?php
return [
    'id' => 'app-common-tests',
    'basePath' => dirname(dirname(dirname(dirname(__DIR__)))),
    'components' => [
        'user' => [
            'class' => 'yii\web\User',
            'identityClass' => 'common\models\User',
        ],
        'db' => [
            'class'       => 'yii\db\Connection',
            'charset'     => 'utf8mb4',
            'tablePrefix' => 'yii_',
            
            //добавляем это для создания одного постоянного соединения
            'attributes'=>[
                \PDO::ATTR_PERSISTENT => true
            ],
        ],
    ],
];
2) В tests/unit.suite.yml добавляем transaction: false
Например:

Код: Выделить всё

class_name: UnitTester
bootstrap: false
modules:
    enabled:
        - Asserts
        - Yii2:
            #добавляем это для совместимости с постоянным подключением. Отключает транзакции.
            transaction: false

Ответить