Python: Mock side_effect по атрибуту объекта

Возможно ли иметь свойство side_effect для свойства? Если я смотрю на документацию Mock, это кажется возможным только для методов объектов.

Я пытаюсь проверить следующее:

def get_object(self): 
    try:
        return self.request.user.shop
    except Shop.DoesNotExist:
        return None

Я хочу, чтобы в магазине было создано исключение DoNotExist.

Угадайте, может быть, я был недостаточно ясен, но я говорю о библиотеке widspace mock.

http://www.voidspace.org.uk/python/mock/index.html

Ответ 2

Стоит отметить, что теперь существует класс PropertyMock:

>>> m = MagicMock()
>>> p = PropertyMock(side_effect=ValueError)
>>> type(m).foo = p
>>> m.foo
Traceback (most recent call last):
....
ValueError

Этот пример был взято с официального сайта.

Ответ 3

Да, вы можете использовать для него свойство:

In [1]: class ShopDoesNotExist(Exception):
   ...:     pass
   ...:

In [2]: class User(object):
   ...:     @property
   ...:     def shop(self):
   ...:         raise ShopDoesNotExist
   ...:
   ...:

In [3]: u = User()

In [4]: u.shop
---------------------------------------------------------------------------
ShopDoesNotExist                          Traceback (most recent call last)

Ответ 4

Вы также можете попытаться исправить связанное поле, используя PropertyMock как new_callable аргумент.

Пример:

from unittest import TestCase
import mock
from django import models
from django.core.exceptions import ObjectDoesNotExist

class Foo(models.Model):
    # ...
    @property
    def has_pending_related(self):
        try:
            return self.related_field.is_pending
        except ObjectDoesNotExist:
            return False

class FooTestCase(TestCase):
    # ...
    @mock.patch.object(Foo, 'related_field', new_callable=mock.PropertyMock)
    def test_pending_related(self, related_field):
        related_field.side_effect = ObjectDoesNotExist
        foo = Foo()
        self.assertFalse(foo.has_pending_related)