Dingus seperti objek tiruan. Perbedaan utama adalah Anda tidak mengatur harapan sebelumnya. Anda hanya menjalankan kode Anda, menggunakan dingus sebagai pengganti objek atau kelas lain, dan itu akan mencatat apa yang terjadi padanya. Kemudian, setelah kode Anda dilakukan, Anda dapat membuat pernyataan tentang apa yang terjadi pada dingus.
Dingus baru dibuat dari kelas Dingus. Anda dapat memberikan nama dingus, yang membantu dengan men -debug tes Anda, terutama ketika ada beberapa dingus dalam permainan.
>>> from dingus import Dingus >>> d = Dingus( ' root ' ) >>> d <Dingus root>
Mengakses atribut dingus apa pun akan mengembalikan dingus baru.
>>> d.something <Dingus root.something>
Ada beberapa pengecualian untuk metode dingus khusus. Kita akan melihat beberapa di sedikit.
Dingus juga dapat disebut seperti fungsi atau metode. Tidak peduli berapa banyak argumen yang Anda berikan atau apa argumen itu. Panggilan ke dingus akan selalu mengembalikan objek yang sama, terlepas dari argumennya.
>>> d() <Dingus root()> >>> d( ' argument ' ) <Dingus root()> >>> d( 55 ) <Dingus root()>
Kapan saja kami bisa mendapatkan daftar panggilan yang telah dilakukan ke dingus. Setiap entri dalam daftar panggilan berisi:
Berikut adalah daftar panggilan yang telah kami buat ke D sejauh ini:
>>> from pprint import pprint >>> pprint(d.calls) [('()', (), {}, <Dingus root()>), ('()', ('argument',), {}, <Dingus root()>), ('()', (55,), {}, <Dingus root()>)]
Anda dapat memfilter panggilan berdasarkan nama, argumen, dan argumen kata kunci:
>>> pprint(d.calls( ' () ' , 55 )) [('()', (55,), {}, <Dingus root()>)]
Jika Anda tidak peduli dengan nilai argumen tertentu, Anda dapat menggunakan nilai DontCare saat memfilter:
>>> from dingus import DontCare >>> pprint(d.calls( ' () ' , DontCare)) [('()', ('argument',), {}, <Dingus root()>), ('()', (55,), {}, <Dingus root()>)]
Dingus dapat melakukan lebih dari sekadar memiliki atribut yang diakses dan dipanggil. Mereka mendukung banyak operator Python. Tujuannya adalah untuk mengizinkan, dan mencatat, interaksi apa pun:
>>> d = Dingus( ' root ' ) >>> ( 2 ** d.something)[ ' hello ' ]() / 100 * ' foo ' <Dingus root.something.__rpow__[hello]().__div__.__mul__>
(Semoga rekaman dingus dunia nyata Anda tidak akan terlihat seperti ini!)
Dingus menyediakan manajer konteks untuk menambal objek selama pengujian. Misalnya:
>>> from dingus import patch >>> import urllib2 >>> with patch( ' urllib2.urlopen ' ): ... print urllib2.urlopen. __class__ <class 'dingus.Dingus'> >>> print urllib2.urlopen. __class__ <type 'function'>
Anda juga dapat menggunakan ini sebagai dekorator pada metode pengujian Anda:
>>> @ patch( ' urllib2.urlopen ' ) ... def test_something ( self ): ... pass ...
Kebalikan dari tambalan adalah isolat. Itu menambal semuanya kecuali objek yang disebutkan:
>>> from dingus import isolate >>> @ isolate( ' urllib2.urlparse ' ) ... def test_urlparse ( self ): ... pass ...
Ketika tes ini berjalan, semua yang ada di modul Urllib2 kecuali urlparse akan menjadi dingus. Perhatikan bahwa ini mungkin lambat dieksekusi jika modul berisi banyak objek; Patch kinerja dipersilakan. :)
Dingus juga dapat secara otomatis menggantikan global modul saat menjalankan tes. Ini memungkinkan Anda untuk menulis tes unit yang terisolasi sepenuhnya. Lihat contoh/urllib2/test_urllib2.py untuk contoh. Penulis tidak lagi merekomendasikan fitur ini, karena dapat mendorong tes yang sangat rapuh. Anda harus merasakan rasa sakit dari ketergantungan mengejek secara manual; Rasa sakit akan memberi tahu Anda ketika kelas berkolaborasi dengan terlalu banyak orang lain.