пятница, 20 декабря 2013 г.

Ещё раз про DelphiSpec и "тестировании по-русски" №2. Для "ценителей"

Предыдущая серия была тут - http://programmingmindstream.blogspot.ru/2013/12/delphispec_20.html

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

По-моему - прикольно :-)

Комментариев нет:

Отправить комментарий