Как издеваться над отношениями на Django - PullRequest
1 голос
/ 20 февраля 2020

У меня сейчас проблема, я не могу понять, как смоделировать отношение.

Допустим, у меня есть модель с именем

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, чтобы вызвать это исключение или вернуть какой-нибудь произвольный экземпляр?

1 Ответ

1 голос
/ 20 февраля 2020

Вот способ сделать это без 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...