Предыдущая серия была тут - http://programmingmindstream.blogspot.ru/2013/12/delphispec_20.html
Можно пойти дальше и избавится от глобальной переменной gTestedObject
Таким образом:
Делаем переменную gTestedObject локальной:
Делаем вызываемые слова "зависимыми от контекста вызова" (метим их "директивой" CallerWorker) и используем в них контекст (через конструкцию Caller -> gTestedObject):
Что мы тут имеем?
Внутри Scenario: мы скомпилировали код, который объявляет переменную gTestedObject.
И зарегистировали его в тестовой машине.
И мы пометили наши "слова обвязки" как "слова зависящие от контекста" ("директивой" CallerWorker).
Этот контекст передаётся в них как "параметр" Caller. "Скрытый". Примерно как Self в методах объектов в ООП.
От которого конструкцией Caller -> gTestedObject мы получаем переменную gTestedObject от КОНКРЕТНОГО контекста вызова.
По-моему - прикольно :-)
Можно пойти дальше и избавится от глобальной переменной gTestedObject
Таким образом:
Делаем переменную gTestedObject локальной:
WordWorker2 Scenario: FUNCTOR IN anObjectConstructor STRING VAR l_ScenarioName // - объявляем переменную для имени сценария l_ScenarioName := ( WordToWork1 DO ) // - получаем имя сценария l_ScenarioName // - кладём имя сценария на стек @ ( OBJECT VAR gTestedObject // - текущий тестируемый объект gTestedObject := ( [ // - Обратно переключаемся в режим выполнения anObjectConstructor CompileValue // - компилируем значение anObjectConstructor как "литерал" в коде ] // - Обратно переключаемся в режим компиляции DO ) // - создаём тестируемый объект TRY [ WordToWork2 CompileValue ] DO // - выполняем код сценария FINALLY gTestedObject TObject.Free // - уничтожаем тестируемый объект END ) // - компилируем код сценария на стек TestEngine.RegisterTest // - регистрируем в тестовой машине тест с именем сценария и указанным кодом ; // Scenario:
Делаем вызываемые слова "зависимыми от контекста вызова" (метим их "директивой" CallerWorker) и используем в них контекст (через конструкцию Caller -> gTestedObject):
OBJECT FUNCTON Calculator Resut := ( @ TCalculator.Create ) // - возвращаем указатель на конструктор объекта ; PROCEDURE CallerWorker "I have entered {(INTEGER IN aValue)} in calculator" aValue Caller -> gTestedObject TCalculator.Push ; PROCEDURE CallerWorker "I press Add" Caller -> gTestedObject TCalculator.Add ; PROCEDURE CallerWorker "I press mul" Caller -> gTestedObject TCalculator.Mul ; [] FUNCTION CallerWorker "the result should be {(INTEGER IN aValue)} on the screen" Result := [[ ( Caller -> gTestedObject TCalculator.GetValue = aValue ) 'Incorrect result on calculator screen' ]] ;
Что мы тут имеем?
Внутри Scenario: мы скомпилировали код, который объявляет переменную gTestedObject.
И зарегистировали его в тестовой машине.
И мы пометили наши "слова обвязки" как "слова зависящие от контекста" ("директивой" CallerWorker).
Этот контекст передаётся в них как "параметр" Caller. "Скрытый". Примерно как Self в методах объектов в ООП.
От которого конструкцией Caller -> gTestedObject мы получаем переменную gTestedObject от КОНКРЕТНОГО контекста вызова.
По-моему - прикольно :-)
Комментариев нет:
Отправить комментарий