簡體   English   中英

Python:在對象屬性上模擬 side_effect

[英]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 模擬庫。

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

值得注意的是,現在有了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM