Dingus вроде как фиктивный объект. Основное отличие заключается в том, что вы не настраиваете ожидания заранее. Вы просто запускаете свой код, используя Dingus вместо другого объекта или класса, и он будет записывать, что с ним происходит. Затем, как только ваш код будет осуществлен, вы можете сделать утверждения о том, что он сделал с Dingus.
Новый Dingus создан из класса Dingus. Вы можете дать Dinguses имена, которые помогают отладки ваших тестов, особенно когда в игре есть несколько динг.
>>> from dingus import Dingus >>> d = Dingus( ' root ' ) >>> d <Dingus root>
Доступ к любому атрибуту Dingus вернет новый Dingus.
>>> d.something <Dingus root.something>
Есть несколько исключений для специальных методов Dingus. Посмотрим немного.
Динг также можно назвать как функция или метод. Это не заботится о том, сколько аргументов вы его даете или каковы эти аргументы. Призывы к динусу всегда будут возвращать один и тот же объект, независимо от аргументов.
>>> d() <Dingus root()> >>> d( ' argument ' ) <Dingus root()> >>> d( 55 ) <Dingus root()>
В любое время мы можем получить список звонков, которые были сделаны в динг. Каждая запись в списке вызовов содержит:
Вот список звонков, которые мы сделали для 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()>)]
Дингалы могут делать больше, чем просто иметь доступ к атрибутам и быть вызванными. Они поддерживают многих операторов 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 для примера. Автор больше не рекомендует эту функцию, так как она может поощрять очень хрупкие тесты. Вы должны почувствовать боль от вручную насмешливых зависимостей; Боль скажет вам, когда класс сотрудничает со слишком многими другими.