mock
用於單元測試中替換系統的某些部分。
Mock
和 MagicMock
是很是相似的,區別只是MagicMock
對魔法方法的改進。
此兩者在訪問它們的時候,會建立全部的屬性和方法,而且記錄下它們是如何被調用的。固然咱們也能夠配置他們:1.指定他們的返回值 2.限制它們哪些屬性可使用。從而能夠斷言他們是如何被調用的。python
mock
使用了python的一個特性,即:一切皆對象,變量名指向的是某個對象的內存地址。所以,在使用mock
的時候,實際上是更改了某個變量的指向。
ide
關於mock
對象
從圖中截圖中能夠看到mock
對象的一些屬性,其中return_value
比較特殊,它的返回值默認狀況下依舊是一個mock
對象。並且經過點開該mock
對象,會發現,被返回的這個mock
對象的return_value
的返回值默認依舊是一個mock
對象。。如此這般,永無止境的進行下去。固然這個return_value
是能夠修改的。並且也常常會被修改。單元測試
某個方法被mock
以後,return_value
用來指定該方法被調用時的返回值。測試
from unittest import mock somefunc = mock.Mock(return_value=3) print(somefunc()) #3 somefunc_2 = mock.Mock() somefunc_2.return_value = 3 print(somefunc_2())#3
side_effect
經常使用於:3d
somefunc = mock.Mock(side_effect=KeyError()) print(somefunc()) #################### Traceback (most recent call last): File "/home/an/PycharmProjects/daily/mock_study.py", line 11, in <module> print(somefunc()) File "/usr/lib/python3.6/unittest/mock.py", line 939, in __call__ return _mock_self._mock_call(*args, **kwargs) File "/usr/lib/python3.6/unittest/mock.py", line 995, in _mock_call raise effect KeyError
a_dict = {"a": 1, "b": 2, "c": 3} def site(arg): return a_dict[arg] some_func = mock.Mock(side_effect=site) print(some_func("a")) # 1
a_list = [1, 2, 3, 4, 5] some_func = mock.Mock(side_effect=a_list) print(some_func()) #1 print(some_func())#2 print(some_func()) #3
spec
能夠是一個 字符串列表,或者是一個類,或者是一個對象,用來規範如何建立 mock
對象code
class A(object): def __init__(self, name, age): self.name = name self.age = age def get_name(self): return "A-{}".format(self.name) def get_age(self): return self.age spec_A = mock.Mock(spec=A) # print(spec_A.gender) # AttributeError print(spec_A.get_name()) # <Mock name='mock.get_name()' id='140226191056736'> spec_a = mock.Mock(spec=A('a', 10)) # print(spec_a.gender) # AttributeError print(spec_a.age) # <Mock name='mock.age' id='140226191088272'> spec_a.age = 99 print(spec_a.age) # 99 spec_list = mock.Mock(spec=['gender']) # print(spec_list.name) # AttributeError print(spec_list.gender) # <Mock name='mock.gender' id='140226191088888'>