Dingus는 일종의 모의 물체와 같습니다. 주요 차이점은 기대치를 미리 설정하지 않는다는 것입니다. 당신은 다른 객체 나 클래스 대신에 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는 단순히 속성에 액세스하고 호출되는 것 이상을 수행 할 수 있습니다. 그들은 많은 파이썬 연산자를 지원합니다. 목표는 상호 작용을 허용하고 기록하는 것입니다.
>>> 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 ...
이 테스트가 실행되면 urlparse를 제외한 urllib2 모듈의 모든 것이 딩고가됩니다. 모듈에 많은 객체가 포함되어 있으면 실행하는 데 속도가 느릴 수 있습니다. 성능 패치를 환영합니다. :)
Dingus는 테스트를 실행할 때 모듈의 글로벌을 자동으로 교체 할 수 있습니다. 이를 통해 완전히 고립 된 단위 테스트를 작성할 수 있습니다. 예는 예제/urllib2/test_urllib2.py를 참조하십시오. 저자는 더 이상 취성 테스트를 장려 할 수 있으므로이 기능을 더 이상 권장하지 않습니다. 수동으로 조롱하는 종속성의 고통을 느끼겠다고 생각해야합니다. 수업이 너무 많은 다른 사람들과 협력 할 때 고통은 당신에게 알려줄 것입니다.