摘要:也就是說,如果不需要,兩者使用起來并沒有什么分別。來看個例子,先定義個類,里面只有一個成員方法,返回倍的數值使用類來掉這個成員方法使用類來兩者沒有任何區別,都成功了了成員方法。再看下兩者的區別因為使用類時,默認不會創建這個的,所以報錯。
Python的unittest.mock模塊中提供了兩個主要的mock類,分別是Mock和MagicMock.
先看一下官方文檔的定義:
MagicMock is a subclass of Mock with all the magic methods pre-created and ready to use.
其實已經很清楚了,MagicMock是Mock的子類,并且預先創建了全部magic method的mock。
也就是說,如果不需要mock magic method,兩者使用起來并沒有什么分別。
來看個例子,先定義個類,里面只有一個成員方法,返回10倍的數值:
class Person: def get_10_times_value(self, value) return 10 * value
使用Mock類來mock掉這個成員方法:
def test_should_mock_get_10_times_value_with_Mock(self): p = Person() p.get_10_times_value = Mock(return_value=100) self.assertEqual(p.get_10_times_value(), 100)
使用MagicMock類來mock:
def test_should_mock_get_10_times_value_with_MagicMock(self): p = Person() p.get_10_times_value = MagicMock(return_value=100) self.assertEqual(p.get_10_times_value(), 100)
兩者沒有任何區別,都成功了mock了成員方法。
再看下兩者的區別:
def test_should_raise_exception(self): m = Mock() list(m) TypeError: "Mock" object is not iterable
因為使用Mock類時,默認不會創建__iter__這個magic method的mock,所以報錯。
如果想mock __iter__這個方法,得自己去做,如下:
def test_should_mock_magic_method_with_Mock(self): m = Mock() m.__iter__ = Mock(return_value=iter([])) self.assertEqual(list(m), [])
而使用MagicMock類時默認就會mock掉所有的magic method,所以不需要自己mock,__iter__默認是空數組:
def test_should_mock_magic_method_with_MagicMock(self): m = MagicMock() self.assertEqual(list(m), [])
因為已經默認創建了magic method的mock,所以可以直接使用return_value屬性來改變值:
def test_should_mock_magic_method_with_MagicMock(self): m = MagicMock() m.__iter__.return_value = [1, 2, 3] self.assertEqual(list(m), [1, 2, 3])
其他magic method類似。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45539.html
摘要:非常適合寫單元測試用它掉網絡請求的返回值即可測試用的給上面的加裝飾器放在上面這種一般的使用場景就是加緩存或者計時之類因為異步的里面是個所以最里面包的一層還是要加并且用返回 mock非常適合寫單元測試, 用它patch掉網絡請求的返回值即可 async_func.py #!/usr/bin/env python # -*- coding:utf-8 -*- import signal i...
摘要:接下來我們將介紹如何對對象的方法進行模擬測試。選項創建模擬測試接口我們可以在的構造函數中提供一個模擬測試實例,而不是模擬創建具體的模擬測試方法。 如何不靠耐心測試 通常,我們編寫的軟件會直接與那些我們稱之為骯臟的服務交互。通俗地說,服務對我們的應用來說是至關重要的,它們之間的交互是我們設計好的,但這會帶來我們不希望的副作用——就是那些在我們自己測試的時候不希望的功能。 比如,可能我們...
摘要:準確的說,是中一個用于支持單元測試的庫,它的主要功能是使用對象替代掉指定的對象,以達到模擬對象的行為。下面我們使用對象在單元測試中分別測試訪問正常和訪問不正常的情況。 Mock是什么 Mock這個詞在英語中有模擬的這個意思,因此我們可以猜測出這個庫的主要功能是模擬一些東西。準確的說,Mock是Python中一個用于支持單元測試的庫,它的主要功能是使用mock對象替代掉指定的Python...
摘要:一些常用的示例先簡單定義個類,方便舉例這個類里有兩個成員方法,一個有參數,一個無參數。有個模塊方法,返回數據庫中所有指定的人員,并按排序掉整個數據庫訪問先得到一個的對象,再在中設置一個對象,此時不需要自己再創建 一些常用的mock示例 先簡單定義個類,方便舉例: class Person: def __init__(self): self.__age = 10 ...
閱讀 781·2021-11-09 09:47
閱讀 1568·2019-08-30 15:44
閱讀 1143·2019-08-26 13:46
閱讀 2107·2019-08-26 13:41
閱讀 1266·2019-08-26 13:32
閱讀 3772·2019-08-26 10:35
閱讀 3519·2019-08-23 17:16
閱讀 448·2019-08-23 17:07