Тестирование 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 тестовых метода.

Вернуться на верх