Как правильно подключиться к базе данных для тестирования django?

У меня проблема с базой данных тестирования django.

Я использую метод setUp следующим образом:

def setUp(self):
    super().setUp()
    self.obj1 = MyModel.objects.create(name="name1")
    self.obj2 = MyModel.objects.create(name="name2")
    self.obj3 = MyModel.objects.create(name="name3")

Но когда я пытаюсь подключиться к тестовой базе данных:

import psycopg2
from psycopg2 import sql

db_uri = settings.DB_URI.replace("/db_name", "/test_db_name")
con = psycopg2.connect(db_uri)
cur = con.cursor()

и выполнить:

query = sql.SQL(
    "select * from {table};"
).format(
    table=sql.Identifier("mymodel_table_name"),
)
cur.execute(query)

print('result', cur.fetchall())

В результате я вижу пустой список.

НО! Если я вставляю что-то в базу данных для тестирования:

query = sql.SQL(
    "insert into {table} (id, name) values ({id}, {name});"
).format(
    table=sql.Identifier("mymodel_table_name"),
    id=sql.Literal(some_id),
    name=sql.Literal(some_name),
)
cur.execute(query)

Я вижу это в ORM, когда я выполняю:

MyModel.objects.all()

Моя цель - получить в test_db_name все объекты, которые я вставляю в метод setUp.

Спасибо за любую помощь!

У меня была точно такая же проблема, оказалось, что нужно было использовать TransactionTestCase вместо TestCase.

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

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