Вопрос №55311 от пользователя Evgeny Tevelevich в уроке «Третья нормальная форма», курс «Основы реляционных баз данных»
В обратной связи, по этому упражнению, многие жалуются на не корректную работу тестов.
Проблема проявляется если, следовать рекомендациями из README:
Перед тем как писать запросы в файл, зайдите в psql и поэкспериментируйте как следует
Проблема в тестах заключается в следующем: Только в одной из трех транзакций предварительно удаляются таблицы созданные в результате экспериментов.
Решение:
В test.js, в двух местах заменить строки:
await client.transaction(async (trx) => {
await trx.raw(sql);
на
await client.transaction(async (trx) =>
await trx.schema.dropTableIfExists('country_region_cities');
await trx.schema.dropTableIfExists('country_regions');
await trx.schema.dropTableIfExists('countries');
await trx.raw(sql);
Спасибо за то, что указали на возможную проблему! Но тесты, которые находятся в одном файле, выполняются последовательно. Соответственно при каждом запуске все тесты отрабатывают заново. Должно быть вполне достаточно один раз сбросить таблицы, если они существуют. А можете, пожалуйста, привести более детальный пример ситуации при котором сброс таблиц понадобился бы в каждом из трех тестов?
Вы, были бы правы, если бы каждый тест (транзакция) заканчивался коммитом. Но, каждый тест заканчиваются rollback(что логично для тестов). И по этому надо готовить БД каждый раз заново.
Отсюда возможны два варианта решения проблемы тестами: 1) сделать как я написал. 2) транзакцию с очисткой базы сделать уровнем выше.
Вариант 1 проще и быстрее, какой правильнее, надеюсь услышать от Вас.
...upd
Например:
в Упражнение 15, этого курса, проблема повторяется. Что подтверждается в обсуждениях.
в Упражнение 16 проблема решена способом близким к 1.
Оу. Согласен с вами. Я допустил ошибку в ответе, забыв об откате транзакции. К сожалению, все мы иногда ошибаемся.
Я исправил тесты в этом и 15 упражнении. Чтобы обновить контейнер, нужно выполнить сброс с помощью кнопки на панели справа. Так вы получите последнюю версию практики.
В таких случаях, код выносят в beforeEach()
, таким образом уходит дублирование и сброс состояния базы происходит перед каждым тестом.
Еще раз спасибо, что обратили внимание на ошибки!
Роман Ашиков, провел ручное тестирование, ваших тестов здесь и в упражнении 15.
К сожалению работу тестов нельзя назвать корректной:
- С одной стороны, тесты отрабатывают и текущее состояние базы им не мешает.
- Но после выполнения тестов база изменяет свое состояние. И это не то поведение, которое ожидают пользователи.
Так что, выносить подготовительный код в beforeEach(), когда тестируются БД не совсем корректно, так как там работает транзакция с коммитом. О чем свидетельствуют реализации тестов в других упражнения этого курса.
Извиняюсь за задержку с ответом. Я еще раз всё проверю и отпишусь. Спасибо! Поставил тикет на эту задачу.
Приветствую!
Я доработал тесты. Спасибо! Чтобы увидеть изменения, выполните сброс в упражнении.
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







