继承的 Django 模型的 Pytest 补丁字段的默认属性

Pytest patch field's default attribute for inherited django model

我在 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() returns 未调用。这可能是什么问题?

我认为问题在于 guid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False) 在解析时直接引用了 uuid.uuid4 函数。当您设置模拟时,替换此指针为时已晚。

将其更改为 guid = models.UUIDField(unique=True, default=lambda: uuid.uuid4(), editable=False) 之类的内容应该可以解决您的问题,因为该值是在运行时返回的,并且您的 mock 将在引用和调用函数之前正确设置。