Вопрос №55311 от пользователя Evgeny Tevelevich в уроке «Третья нормальная форма», курс «Основы реляционных баз данных»

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);
6 0

Roman Ashikov

Спасибо за то, что указали на возможную проблему! Но тесты, которые находятся в одном файле, выполняются последовательно. Соответственно при каждом запуске все тесты отрабатывают заново. Должно быть вполне достаточно один раз сбросить таблицы, если они существуют. А можете, пожалуйста, привести более детальный пример ситуации при котором сброс таблиц понадобился бы в каждом из трех тестов?

0

Evgeny Tevelevich

Вы, были бы правы, если бы каждый тест (транзакция) заканчивался коммитом. Но, каждый тест заканчиваются rollback(что логично для тестов). И по этому надо готовить БД каждый раз заново.

Отсюда возможны два варианта решения проблемы тестами: 1) сделать как я написал. 2) транзакцию с очисткой базы сделать уровнем выше.

Вариант 1 проще и быстрее, какой правильнее, надеюсь услышать от Вас.

...upd

Например:

  • в Упражнение 15, этого курса, проблема повторяется. Что подтверждается в обсуждениях.

  • в Упражнение 16 проблема решена способом близким к 1.

0

Roman Ashikov

Оу. Согласен с вами. Я допустил ошибку в ответе, забыв об откате транзакции. К сожалению, все мы иногда ошибаемся.

Я исправил тесты в этом и 15 упражнении. Чтобы обновить контейнер, нужно выполнить сброс с помощью кнопки на панели справа. Так вы получите последнюю версию практики.

В таких случаях, код выносят в beforeEach(), таким образом уходит дублирование и сброс состояния базы происходит перед каждым тестом.

Еще раз спасибо, что обратили внимание на ошибки!

0

Evgeny Tevelevich

Роман Ашиков, провел ручное тестирование, ваших тестов здесь и в упражнении 15.

К сожалению работу тестов нельзя назвать корректной:

  1. С одной стороны, тесты отрабатывают и текущее состояние базы им не мешает.
  2. Но после выполнения тестов база изменяет свое состояние. И это не то поведение, которое ожидают пользователи.

Так что, выносить подготовительный код в beforeEach(), когда тестируются БД не совсем корректно, так как там работает транзакция с коммитом. О чем свидетельствуют реализации тестов в других упражнения этого курса.

0

Roman Ashikov

Извиняюсь за задержку с ответом. Я еще раз всё проверю и отпишусь. Спасибо! Поставил тикет на эту задачу.

0

Roman Ashikov

Приветствую!

Я доработал тесты. Спасибо! Чтобы увидеть изменения, выполните сброс в упражнении.

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
18 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
18 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
18 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
18 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
18 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
18 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
18 мая 5 месяцев