Codeception — транзакции — SAVEPOINT LEVEL1 does not exist

Всё про тестирование в Yii 2.0
Ответить
Аватара пользователя
denisbondar
Сообщения: 31
Зарегистрирован: 2015.10.12, 19:34

Codeception — транзакции — SAVEPOINT LEVEL1 does not exist

Сообщение denisbondar »

Добрый день, уважаемое сообщество.

При выполнении модульных и функциональных тестов, проверяющих метод с транзакцией, получаю ошибку:
SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT LEVEL1 does not exist The SQL being executed was: RELEASE SAVEPOINT LEVEL1

Модульный тест проверяет класс формы на сохранение — в методе сохранения моделей используется транзакция.
Функциональный тест выполняет сабмит формы, что вызывает тот же метод сохранения моделей агрегата.
Если убрать транзакции, то тесты проходят нормально. Такая проблема только в тестах, через браузер проблемы нет.

Настройки unit.suite.yml:

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

class_name: UnitTester
modules:
    enabled:
        - Yii2:
            part: [orm, email, fixtures]
        - Asserts
Настройки functional.suite.yml:

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

class_name: FunctionalTester
modules:
    enabled:
        - Yii2
Модульный тестовый метод:

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

public function testCreateNewCorrectAdministrator()
{
    $form = new AdministratorForm();
    $form->setAttributes([
        'email' => 'test@administrator.com',
        'password' => 'asdASD123',
        'password_repeat' => 'asdASD123',
        'first_name' => 'Test',
        'last_name' => 'Administrator',
        'nick_name' => 'testadmin',
        'birthday' => '22.11.1955',
    ]);
    expect('validation complete', $form->validate())->true();
    expect('save complete', $form->save())->isInstanceOf(Administrator::className());
}
Функциональный тестовый метод:

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

public function tryToCreateCorrect(FunctionalTester $I)
{
    $I->see('Create administrator', 'h1');
    $I->submitForm('#admin-create-form', [
        'AdministratorForm[email]' => 'test@administrator.com',
        'AdministratorForm[password]' => 'asdASD123',
        'AdministratorForm[password_repeat]' => 'asdASD123',
        'AdministratorForm[first_name]' => 'Test',
        'AdministratorForm[last_name]' => 'Administrator',
        'AdministratorForm[nick_name]' => 'testadmin',
        'AdministratorForm[birthday]' => '22.11.1955',
    ]);
    $I->see('Administrators', 'h1');
}
Класс формы содержит метод:

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

public function save()
{
    $administrator = new Administrator();
    $administrator->email = $this->email;
    $administrator->setPassword($this->password);
    $administrator->generateAuthKey();
    
    $profile = new AdministratorProfile();
    $profile->attributes = $this->attributes;

    $transaction = \Yii::$app->db->beginTransaction();
    try {
        if ($administrator->save()) {
            $profile->administrator_id = $administrator->id;
            if ($profile->save()) {
                $transaction->commit();

                return $administrator;
            }
        }
        $transaction->rollBack();

        return null;
    } catch (\Exception $e) {
        $transaction->rollBack();
        \Yii::$app->session->setFlash('error', '<strong>Error create administrator</strong><br />' . $e->getMessage());
    }
}
Версии:
yiisoft/yii2 - 2.0.11.2
codeception/codeception - 2.2.9
Аватара пользователя
denisbondar
Сообщения: 31
Зарегистрирован: 2015.10.12, 19:34

Re: Codeception — транзакции — SAVEPOINT LEVEL1 does not exist

Сообщение denisbondar »

Проблема решилась отключением транзакций в Codeception, но, кажется, это не лучшее решение и скорее всего не решает проблему, а добавляет.

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

modules:
    config:
        Yii2:
            cleanup: false
Но тесты теперь проходят :|
Ответить