Я пишу тест Django, наследующий от django.test.TestCase
. Везде, в документации, это руководство и даже в этом принятом SO принятый ответ указано, что при использовании Django TestCase автоматически создается тестовая БД. Раньше я работал с DRF APITestCases, и все работало хорошо. Здесь я использую очень стандартный подход, но метод класса setUpTestData
использует мою производственную базу данных.
Что я делаю неправильно и что нужно сделать, чтобы тестовая БД создавалась и использовалась для теста? Пожалуйста, смотрите мой код ниже.
from django.test import TestCase
from agregator.models import AgregatorProduct
from django.db.models import signals
def sample_product_one():
sample_product_one = {
# "id": 1,
"name": "testProdOne",
"dph": 21,
"updated": datetime.now(),
"active": True,
"updatedinstore": False,
"imagechanged": False,
"isVirtualProduct": False,
}
return sample_product_one
class TestCreateProdToCategory(TestCase):
"""
Test for correct creation of records
"""
@classmethod
@factory.django.mute_signals(signals.pre_save, signals.post_save)
def setUpTestData(cls):
AgregatorProduct.objects.create(
**sample_product_one()
)
def test_create_prod_to_cat(self):
product = AgregatorProduct.objects.get(id=1)
self.assertEqual(product.id, 1)
БД настроена:
DATABASES = {
'agregator': {
'NAME': 'name',
'ENGINE': 'sql_server.pyodbc',
'HOST': 'my_ip',
'USER': 'my_user',
'PASSWORD': 'my_pwd',
'OPTIONS': {
'driver': 'ODBC Driver 17 for SQL Server',
'isolation_level': 'READ UNCOMMITTED',
},
}
}
Результаты теста в
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\xevos\xevosadmin\agregator\tests\test_admin_actions\test_products_to_categories_admin_action.py", line 64, in test_create_prod_to_cat
product = AgregatorProduct.objects.get(id=1)
File "C:\xevos\xevosadmin\.venv\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\xevos\xevosadmin\.venv\lib\site-packages\django\db\models\query.py", line 397, in get
raise self.model.DoesNotExist(
agregator.models.AgregatorProduct.DoesNotExist: AgregatorProduct matching query does not exist.
----------------------------------------------------------------------
что является результатом автоинкремента идентификатора и, учитывая, что в производственной базе данных уже есть продукты, он получает идентификатор, например, 151545 (AgregatorProduct matching query does not exist.
является результатом того факта, что продукт, который раньше имел идентификатор = 1, был удален давным-давно в производство БД.)
Таким образом, тест записывает в существующую базу данных, и данные сохраняются там даже после завершения теста.
./manage.py test
, может потребоваться дополнительная осторожность, чтобы вся подготовка к тесту в Django работала правильно. - person GwynBleidD   schedule 30.03.2021py manage.py test
, что должно быть таким же. Я действительно не думаю, что это связано с самой базой данных, потому что нет ничего, что указывало бы на то, что Django пытался ее создать. Это идет непосредственно для производства db - person David Louda   schedule 30.03.2021