首页 > 解决方案 > 如何在 Django 上模拟关系

问题描述

我目前遇到了一个问题,我不知道如何模拟关系。

假设我有一些模型叫做

class MyModel(models.Model):
    name = models.CharField(max_length=10)


class RelatedModel(models.Model):
    my_model = models.OneToOneField(MyModel, on_delete=models.CASCADE, related_name='related_model')
    name = models.CharField(max_length=10

我有一些像这样的存储库类:

class MyModelRepository:
    @staticmethod
    def get_related_model(my_model):
        try:
            return my_model.related_model
        except MyModel.related_model.RelatedObjectDoesNotExist:
            # do some other thing

在为此编写单元测试时,我如何模拟related_model引发此异常或返回一些任意实例?

标签: pythondjangomockingmockitopytest-django

解决方案


这是一种无需 的方法unittest.mock

class MockRelatedModel:
    @property
    def related_model(self):
        raise MyModel.related_model.RelatedObjectDoesNotExist()

如果您确实想使用unittest.mock,可以使用PropertyMock。请注意,这尚未经过测试。坦率地说,我认为创建一个MyModel没有设置 related_model 的实例并调用MyModelRepository.get_related_model.

with patch('path.to.MyModel', new_callable=PropertyMock) as mock_model:
    mock_model.related_model.side_effect = MyModel.related_model.RelatedObjectDoesNotExist()
    instance = MyModel()
    MyModelRepository.get_related_model(instance)

推荐阅读