2016-10-12 6 views
1

У меня есть некоторые unittests, которые требуют ручной отладки. Как-то ничего не записывается в базу данных во время этих тестов.Во время django unittests база данных остается пустой

Есть ли способ заставить Django (или pytest?) Фиксировать изменения непосредственно при выполнении, чтобы я мог реально видеть, что находится в базе данных, когда я попал в точку останова?

my_object = SomeDefaultDjangoModel() 
my_object.some_random_text = 'Just adding some data' 
my_object.save() 

foo = 'bar' <= Hitting breakpoint here. 

Выполнение ручного SQL-запроса по моей базе данных возвращает 0 строк. Как я могу сделать эту работу?

* Обновление *

Проблема заключается в том, что Django не позволяет не сохранять изменения в базе данных до конца каждого запроса, который в большинстве случаев не является проблемой. Однако, если вы хотите обойти ORM и выполнять запросы с использованием необработанного соединения, похоже, для этого нужно создать отдельное соединение с базой данных. Поскольку все транзакции ожидаются до конца запроса, невозможно получить доступ к этим изменениям из другого соединения с базой данных. Это возвращает неверные результаты и приводит к сбою моих unittests.

Я не нашел способ совершения незавершенных транзакций (пока), поэтому я думаю, что начну писать методы save_raw() для своих моделей, которые просто сохраняют данные непосредственно в базе данных.

+0

Или вы уверены, что имеете дело с тестовой базой данных? Он должен быть отделен от вашей «нормальной» базы данных. – elethan

+0

Посмотрите на это https://docs.djangoproject.com/en/1.10/topics/testing/advanced/#advanced-features-of-transactiontestcase –

ответ

0

Подклассу ваших тестов от TransactionTestCase вместо TestCase, после чего данные будут сохранены/зафиксированы как ожидалось, поэтому вы можете непосредственно изучить данные в базе данных.

Per the docs:

TestCase класс Джанго является более широко используется подкласс TransactionTestCase, что делает использование транзакций базы данных объектов ускорить процесс сброса базы данных в известное состояние в начале каждого теста. Вследствие этого , однако, заключается в том, что некоторые поведения базы данных не могут быть протестированы в классе Django TestCase. Например, вы не можете проверить, что в транзакции выполняется код кода , который требуется при использовании select_for_update(). В этих случаях вы должны использовать TransactionTestCase.

TransactionTestCase и TestCase идентичны по форме , в котором база данных сбрасывается в известное состояние и способность к тестового кода, чтобы проверить эффект фиксации и отката, кроме:

  • TransactionTestCase переустанавливает после завершения теста на обрезание всех таблиц. A TransactionTestCase может вызывать фиксацию и откат и наблюдать за эффектами этих вызовов в базе данных.
  • A TestCase, с другой стороны, не обрезает таблицы после теста. Вместо этого он включает тестовый код в транзакции базы данных, которая откат в конце теста. Это гарантирует, что откат в конце теста восстанавливает базу данных в исходное состояние.
Смежные вопросы