При выполнении модульных и функциональных тестов, проверяющих метод с транзакцией, получаю ошибку:
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
Код: Выделить всё
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