继承的 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 将在引用和调用函数之前正确设置。
我在 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 将在引用和调用函数之前正确设置。