简体   繁体   English

如何在 Django 上模拟关系

[英]How to mock relations on Django

I'm currently running into a problem, I can't figure out how to mock a relation.我目前遇到了一个问题,我不知道如何模拟关系。

Let's say I have some model called假设我有一些模型叫做

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

And I have some repository class like this:我有一些这样的存储库类:

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

When writing unit-tests for this how can I mock the related_model to raise this exception or return some arbitrary instance?当编写单元测试为了这个,我怎么能嘲笑related_model提出这个异常,或者返回一些任意的实例?

Here's a way to do it without unittest.mock :这是一种无需unittest.mock

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

If you do want to use unittest.mock you can use PropertyMock .如果你想使用unittest.mock你可以使用PropertyMock Note, this hasn't been tested.请注意,这尚未经过测试。 And frankly, I think it might be easier to create an instance of MyModel without the related_model set on it and call MyModelRepository.get_related_model .坦率地说,我认为在没有设置MyModel情况下创建MyModel的实例并调用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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM