dingus เป็นเหมือนวัตถุจำลอง ความแตกต่างที่สำคัญคือคุณไม่ได้ตั้งค่าความคาดหวังล่วงหน้า คุณเพียงแค่เรียกใช้รหัสของคุณโดยใช้ dingus แทนวัตถุหรือคลาสอื่นและมันจะบันทึกสิ่งที่เกิดขึ้นกับมัน จากนั้นเมื่อใช้รหัสของคุณแล้วคุณสามารถยืนยันได้ว่ามันทำอะไรกับ Dingus
Dingus ใหม่ถูกสร้างขึ้นจากคลาส Dingus คุณสามารถให้ชื่อ 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 แต่ละรายการในรายการโทรมี:
นี่คือรายการของการโทรที่เราได้โทรมาจนถึงตอนนี้:
>>> 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 ในโลกแห่งความเป็นจริงของคุณจะไม่เป็นแบบนี้!)
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 ยกเว้น urlparse จะเป็น dingus โปรดทราบว่านี่อาจช้าในการดำเนินการหากโมดูลมีวัตถุจำนวนมาก ยินดีต้อนรับแพตช์ประสิทธิภาพ -
Dingus ยังสามารถแทนที่ globals ของโมดูลโดยอัตโนมัติเมื่อทำการทดสอบ สิ่งนี้ช่วยให้คุณเขียนการทดสอบหน่วยที่แยกได้อย่างสมบูรณ์ ดูตัวอย่าง/urllib2/test_urllib2.py สำหรับตัวอย่าง ผู้เขียนไม่แนะนำคุณสมบัตินี้อีกต่อไปเนื่องจากสามารถส่งเสริมการทดสอบที่เปราะบางมาก คุณควรรู้สึกถึงความเจ็บปวดจากการเยาะเย้ยด้วยตนเอง ความเจ็บปวดจะบอกคุณเมื่อชั้นเรียนร่วมมือกับคนอื่น ๆ มากเกินไป