Как правильно подключиться к базе данных для тестирования 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 не усекает таблицы после выполнения теста. Вместо этого он заключает тестовый код в транзакцию базы данных. которая сворачивается по окончании теста. Это гарантирует, что откат в конце теста восстанавливает базу данных в ее исходное состояние.