Dingusは、模擬オブジェクトのようなものです。主な違いは、事前に期待を設定しないことです。別のオブジェクトまたはクラスの代わりにディンガスを使用してコードを実行するだけで、それが何が起こるかを記録します。次に、コードが行使されたら、それがDingusに何をしたかについて主張することができます。
Dingusクラスから新しいDingusが作成されます。 Dinguses名を付けることができます。これは、特に複数のDingusが再生されている場合に、テストのデバッグに役立ちます。
>>> 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()>)]
特定の引数の値を気にしない場合は、フィルタリング時に値を使用できます。
>>> 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は、テストを実行するときにモジュールのグローバルを自動的に交換することもできます。これにより、完全に孤立した単体テストを書くことができます。例を参照してください。例については、urllib2/test_urllib2.pyを参照してください。著者は、非常に脆いテストを促進できるため、この機能を推奨しなくなりました。手動でモッキング依存関係の痛みを感じる必要があります。この痛みは、クラスが他の多くの人と協力するときにあなたにわかります。