Pytest исправление атрибута поля по умолчанию для унаследованной модели django

У меня есть следующая модель в common/models.py:

from django.db import models
from uuid import uuid4

class BaseModel(models.Model):
    guid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)

    class Meta:
       abstract = True

В app/models.py у меня есть следующее:

from django.db import models
from common.models import BaseModel

class Entity(BaseModel):
   name = models.CharField()

В тестах я пытался исправить uuid4 следующими способами:

def test_model_create(mocker):
   # Given
   mock_guid = mocker.patch("uuid.uuid4", return_value="some-guid")

   # When
   entity = Entity.objects.create(name="test_name")

   # Then
   mock_guid.assert_called_once()
   assert "some-guid" == entity.guid

mock_guid.assert_called_once() возвращается без вызова. В чем здесь может быть проблема?

Я думаю, что проблема в том, что guid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False) ссылается на функцию uuid.uuid4 непосредственно во время разбора. Когда вы устанавливаете свой макет, уже слишком поздно заменять этот указатель.

Замена на что-то вроде guid = models.UUIDField(unique=True, default=lambda: uuid.uuid4(), editable=False) должна решить вашу проблему, поскольку значение возвращается во время выполнения, и ваш макет будет настроен должным образом до того, как функция будет упомянута и вызвана.

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