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
Ответы
Ответ 1
Автор сделал сообщение в блоге об этой проблеме. Я пошел на первое решение, которое выглядит так:
class UserMock(Mock):
@property
def shop(self):
raise Shop.DoesNotExist()
http://www.voidspace.org.uk/python/weblog/arch_d7_2010_11_20.shtml#e1196
Ответ 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)