Тестирование Django с использованием Testcase ошибка поиска имени_партии и экземпляров
Я выполняю тестирование для файла models.py Django После завершения тестового случая для нескольких классов я застрял в точке
Сначала позвольте мне поделиться файлом models.py
Я пытаюсь проверить update_batch_name
Итак, мой файл test_batch.py выглядит так
from datetime import datetime
from django import apps
from django.dispatch import receiver
from django.test import TestCase
from django.db.utils import IntegrityError
from django.db.models.signals import post_save, post_delete
from farm_management.models import Farm, Device, BatchYield, Batch
from sop_management.models import BatchSOPManagement
class TestBatch(TestCase):
def setUp(self):
self.batch1 = Batch.objects.create(
commodity_id="2",
commodity_variety_id="4",
start_date=datetime(2021, 11, 26, 14, 20, 14),
commodity_name="Apple",
acerage="90",
batch_health="100",
batch_name="(1) Apple | 2021-11-26"
)
self.farm1 = Farm.objects.create(
farm_id="1"
)
def test_batch_count(self):
for i in range(5):
Batch.objects.create(farm_id=self.farm1, acerage="90")
self.farm1.update_batch_count()
assert self.farm1.batch_count == 5
def test_batch(self):
self.assertEqual(self.batch1.commodity_id, "2")
self.assertEqual(self.batch1.commodity_variety_id, "4")
self.assertEqual(self.batch1.farm_id, "1")
self.assertEqual(self.batch1.start_date, "2021-11-26 14:20:14.000000")
self.assertEqual(self.batch1.commodity_name, "Apple")
self.assertEqual(self.batch1.acerage, "90")
self.assertEqual(self.batch1.batch_health, "100")
self.assertEqual(self.batch1.batch_name, "(1) Apple | 2021-11-26")
Очевидно, что это не способ проведения тестирования
Итак, ошибка составляет
======================================================================
ERROR: test_batch_count (farm_management.test.models.test_batch.TestBatch)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/adarsh/igrow-api/app/farm_management/test/models/test_batch.py", line 15, in setUp
self.batch1 = Batch.objects.create(
File "/home/adarsh/igrow-api/venv/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/adarsh/igrow-api/venv/lib/python3.8/site-packages/django/db/models/query.py", line 453, in create
obj.save(force_insert=True, using=self.db)
File "/home/adarsh/igrow-api/app/farm_management/models.py", line 179, in save
super(Batch, self).save(*args, **kwargs)
File "/home/adarsh/igrow-api/venv/lib/python3.8/site-packages/django/db/models/base.py", line 726, in save
self.save_base(using=using, force_insert=force_insert,
File "/home/adarsh/igrow-api/venv/lib/python3.8/site-packages/django/db/models/base.py", line 774, in save_base
post_save.send(
File "/home/adarsh/igrow-api/venv/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 180, in send
return [
File "/home/adarsh/igrow-api/venv/lib/python3.8/site-packages/django/dispatch/dispatcher.py", line 181, in <listcomp>
(receiver, receiver(signal=self, sender=sender, **named))
File "/home/adarsh/igrow-api/app/farm_management/models.py", line 482, in update_batch_count
instance.farm_id.update_batch_count()
AttributeError: 'NoneType' object has no attribute 'update_batch_count'
----------------------------------------------------------------------
Ran 2 tests in 0.538s
FAILED (errors=2)
Destroying test database for alias 'default'...
Итак, если кто-нибудь может помочь выполнить тестирование update_batch_name
Причина
Ошибка возникает из-за сигнала update_batch_count. Вы попытались вызвать update_batch_count на instance.farm_id, однако, значение farm_id равно None. У него нет метода update_batch_count. Кроме того, даже если это не None, это целочисленное поле, поэтому ошибка все равно возникнет.
@receiver([post_save, post_delete], sender=Batch)
def update_batch_count(sender, instance, **kwargs):
instance.farm_id.update_batch_count()
Пояснение
Когда экземпляр Batch создается в setUp, сразу после этого вызывается сигнал update_batch_count, а поскольку метод setUp выполняется перед каждым тестовым методом, это приводит к 2 ошибкам, так как вы определили 2 тестовых метода.