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)
должна решить вашу проблему, поскольку значение возвращается во время выполнения, и ваш макет будет настроен должным образом до того, как функция будет упомянута и вызвана.