Предыдущая серия была тут - 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 от КОНКРЕТНОГО контекста вызова.
По-моему - прикольно :-)
Комментариев нет:
Отправить комментарий