[英]Python: Mock side_effect on object attribute
是否有可能對財產產生副作用? 如果我查看 Mock 文檔,它似乎只能在對象方法上使用。
我正在嘗試測試以下內容:
def get_object(self):
try:
return self.request.user.shop
except Shop.DoesNotExist:
return None
我希望 Shop 提出一個DoesNotExist 異常。
猜猜我可能還不夠清楚,但我說的是 voidspace 模擬庫。
值得注意的是,現在有了PropertyMock
類:
>>> m = MagicMock()
>>> p = PropertyMock(side_effect=ValueError)
>>> type(m).foo = p
>>> m.foo
Traceback (most recent call last):
....
ValueError
該示例取自官方網站。
您還可以嘗試使用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)
是的,您可以為其使用屬性:
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)
作者針對這個問題發了一篇博文。 我選擇了第一個解決方案,如下所示:
class UserMock(Mock):
@property
def shop(self):
raise Shop.DoesNotExist()
http://www.voidspace.org.uk/python/weblog/arch_d7_2010_11_20.shtml#e1196
side_effect
,如果您嘗試將AttributeError
作為side_effect
進行測試,您可以使用spec
參數並將其設置為空列表(即[]
)。 假設您正在嘗試創建一個Mock
對象,該對象在訪問屬性foo
時拋出AttributeError
:
from unittest.mock import Mock
m = Mock(spec = [])
m.foo
# AttributeError: Mock object has no attribute 'foo'
請參閱文檔:
spec:這可以是字符串列表,也可以是充當模擬對象規范的現有對象(類或實例)。 如果您傳入一個對象,則通過在該對象上調用 dir 來形成一個字符串列表(不包括不受支持的魔法屬性和方法)。 訪問不在此列表中的任何屬性將引發 AttributeError。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.