Smalltalk по-русски
понедельник, Февраль 07, 2005
[ST] Unit-тестирование UI

Одной из самых больших проблем тестирования пользовательского интерфейса является его интерактивность. Часто для выполнения тестового сценария необходимо получить подтверждение пользователя на выполнение определенной операции.

Например:

(MessageBox confirm: 'Do you want to overwrite this file?')
	ifTrue: [...]

Традиционным способом решения этой проблемы является вынесение всех обращений к классу MessageBox в отдельный объект-адаптер с последующей его заменой на mock-object.

Но в Smalltalk возможен еще один более простой вариант благодаря наличию продолжаемых исключений (resumable exceptions).

Во-первых, сначала необходимо создать собственный подкласс класса Notification (это исключение по-умолчанию является продолжаемым):

Notification subclass: #ConfirmationNotification
	instanceVariableNames: ''
	classVariableNames: ''
	poolDictionaries: ''
	classInstanceVariableNames: ''

В коде везде, где требуется подтверждение, пишем следующий вызов:

(ConfirmationNotification signal: 'Do you want to overwrite this file?')
	ifTrue: [...]

Тогда тестирование сценария с подтверждением может быть осуществлено следующим образом:

testExample1
	[ Тестовый вызов 
	testedObject doSomething]
		on: ConfirmationNotification do:
			[:n |
			 Эмулируем подтверждение 
			n resume: true].
	 Поверяем, что действие выполнено 

Это вариант с одним подтверждением. А что делать, если их может быть несколько по различным поводам? Первый способ, это использовать поле исключения tag, которое передается с помощью сообщения #signal:with:. Второй способ, это создавать различные подклассы ConfirmationNotification. Он более предпочтителен, когда определенные виды подтверждений встречаются регулярно.

С тестами разобрались, а как теперь сделать, чтобы реальное приложение показывало диалог в соответствующих местах?

Как правило, любое приложение имеет центральный обработчик исключений, отлавливающий ошибки в обработчиках событий верхнего уровня. Именно в него и следует внести поддержку подтверждений:

Object>>handleDomainErrors: aBlock
	aBlock
		on: Error do:
			[:e | MessageBox errorMsg: e messageText caption: 'Error']
		on: ConfirmationNotification do:
			[:n | n resume: (MessageBox confirm: n messageText]

Далее нужно лишь убедиться, что все события верхнего уровня содержат вызов этого обработчика:

someTopLevelEventHandler
	self handleDomainErrors:
		[ Выполнить необходимые действия ]

P.S. Примеры кода приведены для Dolphin Smalltalk, поэтому обращение к классу MessageBox должно быть заменено на эквивалентное действие в других диалектах. Дополнительно, в VisualWorks Smalltalk сообщение #signal: следует заменить на #raiseSignal:.

Comments:
Отлично пишете. Регулярно, с удовольствием читаю Ваши публикации.
 
Отправить комментарий

<< Home

Популярные статьи
:: Smalltalk?!
:: Почему Smalltalk?
:: Great Leap Forward from Java to Smalltalk

Последние сообщения
:: Будущее для Tweak
:: [VW] Полезняшки: OSTimeZone
:: [ANN] www.seaside.st
:: [VW] Знаете ли Вы, что...
:: Croquet Road Map
:: [VW] Полезняшки: StackOverflow, ShiffmanTimeout
:: Объект nil
:: smalltalk@wikipedia
:: Smalltalk Solutions
:: Use continuations to develop complex Web applicati...

Архив
Предыдущие новости / Декабрь 2004 / Январь 2005 / Февраль 2005 / Март 2005 / Апрель 2005 / Май 2005 / Июнь 2005 / Июль 2005 / Август 2005 / Сентябрь 2005 / Октябрь 2005 / Ноябрь 2005 / Декабрь 2005 / Январь 2006 / Февраль 2006 / Март 2006 / Апрель 2006 / Май 2006 / Июнь 2006 / Июль 2006 / Сентябрь 2006 / Октябрь 2006 / Ноябрь 2006 / Декабрь 2006 / Январь 2007 / Февраль 2007 / Март 2007 / Апрель 2007 / Май 2007 / Июнь 2007 / Август 2007 / Сентябрь 2007 / Ноябрь 2007 / Январь 2008 / Март 2008 / Май 2008 / Июнь 2008 / Июль 2008 / Август 2008 / Сентябрь 2008 / Октябрь 2008

Atom Feed
Smalltalk по-русски


Powered by Blogger