пятница, 3 апреля 2009 г.

Пример работы с mock-ами

Контекст


Сайт. Пользователь может задавать вопросы, заполняя и отправляя соответствующую форму. Вопросы представлены экземплярами класса Question. Когда вопрос изменяется (в результате редактирования пользователем) он получает сообщение #changed.

Задача


Когда изменяется вопрос, нужно отослать соответствующее оповещение администратору сайта.

Решение



(1) QuestionTests >> testNotifiesAdminOnChange
(2) | question |
(3) question := Question new.
(4) [ :notifier |
(5) question notifier: notifier.
(6) [ question changed ]
(7) should strictly satisfy:
(8) [ notifier notifyAdminAbout: question ]
(9) ] runScenario


Пояснение


В строках (4) -- (9) создается сценарий.
Параметры сценария (строка (4)) инициализируются mock-объектами.
В блоке (6) описываются действия, определяющие тестируемую ситуацию: question получает сообщение #changed.
В строке (7) задается условие: в результате этих (заданных выше в строке (6) действий должно происходить строго в заданной последовательности то, что записано в блоке строки (8).
В этом блоке записано, что объект notifier должен получить сообщение #notifyAdminAbout: с аргументом, идентичным question.

Обратите внимание! Не указывается, к какому классу будут принадлежать нотификаторы, с которыми будут работать вопросы.
Далее разработка будет включать шаги по созданию и описанию поведения такого класса.

Замечание


Также, возможно, потребуется рефакторинг по вынесению адресата оповещения в параметр и (в дальнейшем, возможно) изменению системы отсылки сообщения. На это указывает наличие указания на адресата (admin) в селекторе сообщения #notifyAdminAbout:.