Dingus有點像模擬對象。主要區別在於您不會提前設置期望。您只需使用Dingus來運行代碼代替另一個對像或類,它將記錄發生的情況。然後,一旦行使代碼,您就可以對其對Dingus的所作所為做出斷言。
由Dingus類創建了新的Dingus。您可以給Dinguses名稱,這有助於調試測試,尤其是在玩多個Dinguses時。
>>> from dingus import Dingus >>> d = Dingus( ' root ' ) >>> d <Dingus root>
訪問Dingus的任何屬性都將返回新的Dingus。
>>> d.something <Dingus root.something>
特殊的Dingus方法有一些例外。我們會稍微看到一些。
Dingus也可以稱為函數或方法。它不在乎您給出多少論點或這些論點是什麼。無論參數如何,呼叫dingus總是會返回同一對象。
>>> d() <Dingus root()> >>> d( ' argument ' ) <Dingus root()> >>> d( 55 ) <Dingus root()>
在任何時候,我們都可以獲取對Dingus的電話列表。呼叫列表中的每個條目都包含:
這是我們到目前為止撥打D的電話的列表:
>>> from pprint import pprint >>> pprint(d.calls) [('()', (), {}, <Dingus root()>), ('()', ('argument',), {}, <Dingus root()>), ('()', (55,), {}, <Dingus root()>)]
您可以按名稱,參數和關鍵字參數過濾:
>>> pprint(d.calls( ' () ' , 55 )) [('()', (55,), {}, <Dingus root()>)]
如果您不關心特定參數的值,則可以在過濾時使用值dontcare:
>>> from dingus import DontCare >>> pprint(d.calls( ' () ' , DontCare)) [('()', ('argument',), {}, <Dingus root()>), ('()', (55,), {}, <Dingus root()>)]
Dinguses可以做的不僅僅是訪問和調用屬性。他們支持許多Python運營商。目標是允許並記錄任何互動:
>>> d = Dingus( ' root ' ) >>> ( 2 ** d.something)[ ' hello ' ]() / 100 * ' foo ' <Dingus root.something.__rpow__[hello]().__div__.__mul__>
(希望您的現實世界中的錄音不會看起來像這樣!)
Dingus為測試期間修補對象提供了上下文管理器。例如:
>>> from dingus import patch >>> import urllib2 >>> with patch( ' urllib2.urlopen ' ): ... print urllib2.urlopen. __class__ <class 'dingus.Dingus'> >>> print urllib2.urlopen. __class__ <type 'function'>
您也可以將其用作測試方法上的裝飾器:
>>> @ patch( ' urllib2.urlopen ' ) ... def test_something ( self ): ... pass ...
斑塊的相反是孤立。它修補除指定對像以外的所有內容:
>>> from dingus import isolate >>> @ isolate( ' urllib2.urlparse ' ) ... def test_urlparse ( self ): ... pass ...
當此測試運行時,Urllib2模塊中的所有內容都將是一個興奮劑。請注意,如果模塊包含許多對象,則執行可能會很慢。歡迎性能補丁。 :)
運行測試時,Dingus還可以自動替換模塊的全球群體。這使您可以編寫完全隔離的單元測試。有關示例,請參見示例/urllib2/test_urllib2.py。作者不再推薦此功能,因為它可以鼓勵非常脆弱的測試。您應該感覺到手動嘲笑依賴的痛苦;當班級與其他太多其他人合作時,痛苦會告訴您。