【问题标题】:How to mock relations on Django如何在 Django 上模拟关系
【发布时间】:2020-02-19 22:59:12
【问题描述】:

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

假设我有一些模型叫做

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 以引发此异常或返回一些任意实例?

【问题讨论】:

  • 我强烈建议您只制作一个没有 RelatedModel 的 MyModel,这会引发此错误

标签: python django mocking mockito pytest-django


【解决方案1】:

这是一种不用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)

【讨论】:

  • 好的!所以我可以使用 PropertyMock 模拟关系!惊人的!但是使用 mockito 呢?
  • 我不知道。我从来没用过。
猜你喜欢
  • 1970-01-01
  • 2017-08-18
  • 2021-12-20
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多