Как правильно использовать Fixture

Всё про тестирование в Yii 2.0
Ответить
puku
Сообщения: 3
Зарегистрирован: 2017.04.05, 17:28

Как правильно использовать Fixture

Сообщение puku » 2017.04.05, 18:10

Столкнулся со следующей проблемой и не могу понять что я делаю не так.

У меня есть 2 таблицы: users(id, login, и т.д.) и forgot_password_tokens(user_id, token).
Поле user_id в forgot_password_tokens это внешний ключ на таблицу users, но ON DELETE и ON UPDATE стоит RESTRICT. Это сделано, потому что мы не удаляем ничего из базы, а только помечаем как удаленное.

Есть 2 теста. Первый тест - тест LoginForm, второй - ResetPasswordForm.
Первый тест подгружает нужную фикстуру пользователя, второй тест загружает фикстуру с токеном. При запуске первый раз они оба проходят без проблем. При запуске второй раз появляется ошибка:

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

Cannot delete or update a parent row: a foreign key constraint fails (`db-ests`.`forgot_password_tokens`, CONSTRAINT `fk_forgot_password_tokens_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`))
Ошибка возникает, потому что запускается тест LoginForm, который пытается перезагрузить фикстуру, для этого он чистиит таблицу, но внешний ключ не дает это сделать.

Я думал, может быть можно как-то указать dependency, что они чистил все зависимые таблицы вначале, но видимо нет.
Единственный способ который я вижу, это писать свой код в метод unload (), который будет чистить нужные мне таблицы. Или все-таки я ошибаюсь?

Аватара пользователя
ElisDN
Сообщения: 4066
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как правильно использовать Fixture

Сообщение ElisDN » 2017.04.05, 21:51

В классах фикстур укажите что-то вроде:

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

public $dependencies = ['yii\tests\InitDbFixture'];
Не пропустите мастер-класс по Yii2.

puku
Сообщения: 3
Зарегистрирован: 2017.04.05, 17:28

Re: Как правильно использовать Fixture

Сообщение puku » 2017.04.06, 11:35

А что это даст? Как я понял, все равно нужно будет создать initdb.php скрипт, который будет чистить всю базу? В этом случае, может действительно проще чистить нужные таблицы в beforeUnload()?

Аватара пользователя
ElisDN
Сообщения: 4066
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как правильно использовать Fixture

Сообщение ElisDN » 2017.04.06, 16:33

puku писал(а):
2017.04.06, 11:35
А что это даст? Как я понял, все равно нужно будет создать initdb.php скрипт, который будет чистить всю базу?
Файл создавать не нужно. Просто этот класс отключает/включает проверку внешних ключей до/после наката миграций.
Не пропустите мастер-класс по Yii2.

puku
Сообщения: 3
Зарегистрирован: 2017.04.05, 17:28

Re: Как правильно использовать Fixture

Сообщение puku » 2017.04.07, 11:09

Да, спасибо, это помогло

Аватара пользователя
vitovt
Сообщения: 196
Зарегистрирован: 2012.03.21, 10:37
Контактная информация:

Re: Как правильно использовать Fixture

Сообщение vitovt » 2017.04.10, 11:24

По документации так

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

 public $depends = ['yii\test\InitDbFixture'];

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость