Dingus вроде как макет объекта. Основным отличием является то, что вы не создали ожидания заранее. Вы просто запустите ваш код, используя Dingus на месте другого объекта или класса, и она будет записывать то, что с ним происходит. Затем, когда ваш код был исполнен, вы можете сделать утверждения о то, что он сделал для Dingus.
Новый Dingus создается из класса Dingus. Вы можете дать dinguses имена, которые помогают с отладкой тесты, особенно, когда есть несколько dinguses в игре.
& NBSP; >>> от импорта Dingus Dingus
& NBSP; г = >>> Dingus ("корень")
& NBSP; г >>>
& NBSP; <корень Dingus>
Доступ любой атрибут Dingus вернется новые Dingus.
& NBSP; >>> d.something
& NBSP;
Есть несколько исключений для методов специальные Dingus. Мы увидим, некоторые в немного.
Dingus также можно назвать как функции или метода. Это все равно, сколько аргументов вы даете ему или то, что эти аргументы. Звонки на Dingus всегда будет возвращать тот же объект, независимо от аргументов.
& NBSP; г >>> ()
& NBSP;
& NBSP; г >>> ('аргумент')
& NBSP;
& NBSP; г >>> (55)
& NBSP;
ЗАПИСЬ и утверждения
В любое время мы можем получить список звонков, которые были сделаны до Dingus. Каждая запись в списке вызовов содержит:
& NBSP; * имя метода называется (или "()", если сам Dingus называли)
& NBSP; * Аргументы, или (), если ни один
& NBSP; * The argumnets ключевых слов, или {}, если ни один
& NBSP; * Значение, возвращается вызывающему
Вот список звонков, которые мы сделали, чтобы г до сих пор:
& NBSP; >>> от импорта pprint pprint
& NBSP; >>> pprint (d.calls)
& NBSP; [('()', (), {},
& NBSP; ('()', ('аргумент',), {},
& NBSP; ('()', (55,), {},
Вы можете фильтровать звонки по имени, аргументы, и именованных аргументов:
& NBSP; >>> pprint (d.calls ('()', 55))
& NBSP; [('()', (55,), {},
Если вы не заботитесь о стоимости конкретного аргумента, вы можете использовать значение DontCare при фильтрации:
& NBSP; >>> от импорта DontCare Dingus
& NBSP; >>> pprint (d.calls ('()', DontCare))
& NBSP; [('()', ('аргумент',), {},
& NBSP; ('()', (55,), {},
Dinguses может сделать больше, чем просто иметь атрибуты доступ и назвать. Они поддерживают множество операторов Python. Цель состоит в том, чтобы позволить, и записывать, любое взаимодействие:
& NBSP; г = >>> Dingus ("корень")
& NBSP; >>> (2 ** d.something) ['привет'] () / 100 * 'Foo'
& NBSP;
(Надеюсь, ваши реальные Dingus записи не будет выглядеть, как это!)
Внесение исправлений
Dingus обеспечивает менеджер контекста для исправления объектов во время испытаний. Например:
& NBSP; >>> от импорта Dingus патч
& NBSP; >>> импорта urllib2
& NBSP; >>> с патчем («urllib2.urlopen '):
& NBSP; ... печать urllib2.urlopen .__ class__
& NBSP; <класс ''> dingus.Dingus
& NBSP; >>> печати urllib2.urlopen .__ class__
& NBSP; <тип "функция">
Вы также можете использовать это в качестве декоратора на ваших методов испытаний:
& NBSP; >>>patch ('urllib2.urlopen')
& NBSP; ... Def test_something (само):
& NBSP; ... передача
& NBSP; ...
ОПАСНО МАГИЯ
Dingus может также автоматически заменить глобальные модуль, когда ходовые испытания. Это позволяет написать полностью изолированных юнит-тестов. Смотрите примеры / urllib2 / test_urllib2.py для примера. Не автор больше не рекомендует эту функцию, так как это может стимулировать очень хрупкие тесты. Вы должны чувствовать боль вручную насмешливые зависимостей; . боль скажет вам, когда класс сотрудничает со слишком многими другими
Требования
- Python
Комментарии не найдены