среда, 6 ноября 2013 г.

GUI-тестирование "по-русски". Использование "нового" RTTI для вызова методов объектов приложения

Вот тут - http://18delphi.blogspot.ru/2013/11/gui.html я описывал как в скриптовой машине публиковать "ручки" для вызова методов на контролах приложения.

В частности там была описана "ручка" (слово скриптовой машины) - ButtonClick.

Это слово было сделано на основе "прямого вызова" к методу контрола.

Примерно вот так:

procedure TkwButtonClick.DoIt(aContext : TscriptContext);
var
 l_Component : TComponent;
begin
 l_Component := aContext.PopObject As TComponent;
 Assert(l_Component Is TButton);
 (l_Component As TButton).Click;
end;

Но ни для кого не секрет, что какой-то из Delphi XEN - принёс нам с собой - "новый" RTTI.

Где очень удобно работать с информацией о методах объектов.

Попробуем применить эту технику для реализации "более низкоуровневого" слова ObjectMethodWithoutParametersCall.

Вызов метода объекта без параметров.

 А уже через это "низкоуровневое слово" мы определим слово ButtonClick как "просто слово" пользовательского словаря.

Понятное дело, что всё это относится к Delphi XEN (не помню версии).

Итак. Опишем наше слово (сама работа с RTTI - "срисована" отсюда - http://delphi2010.ru/?p=218):

interface

 TkwObjectMethodWithoutParametersCall = class(TscriptKeyWord)
  protected
   procedure DoIt(aContext: TscriptContext); override;
 end;//TkwObjectMethodWithoutParametersCall

implementation

procedure TkwObjectMethodWithoutParametersCall.DoIt(aContext: TscriptContext);
var
 l_Object : TObject;
 l_MethodName : String;
 l_t : TRttiType;
 l_ctx : TRttiContext;
 l_ObjectMethod : TRttiMethod;
begin
 l_Object := aContext.PopObject;
 l_MethodName := aContext.PopString;
 l_ctx := TRttiContext.Create;
  l_t := l_ctx.GetType(l_Object.ClassInfo);
  l_ObjectMethod := l_t.GetMethod(l_MethodName);
  if (l_ObjectMethod.GetParameters.Count = 0) then
   l_ObjectMethod.Invoke(l_Object, [])
  else
   Assert(false);
 l_ctx.Free;
end;

initialization
 ScriptEngine.RegisterKeyWord(TkwObjectMethodWithoutParametersCall, 'ObjectMethodWithoutParametersCall');

Повторюсь. Код использования "нового" RTTI - я "срисовывал". И не пробовал сам. Хотя документация выглядит - БОЛЕЕ чем привлекательно.

Но я хотел проиллюстрировать лишь идею.

Когда сам попробую - приведу конечный вариант.

Но "навскидку" - всё вроде бы правильно. И логично.

Итак.

Как же теперь выглядит наш метод ButtonClick с учётом наличия ObjectMethodWithoutParametersCall?

А вот так:

PROCEDURE ButtonClick OBJECT IN aControl
 'Click' aControl ObjectMethodWithoutParametersCall
END // ButtonClick 

Опять же ремарка - обработку ошибок - я пока опустил.

 Всё остальное - остаётся без изменений.

 В частности например вот это:

PROCEDURE "Нажать кнопку" OBJECT IN aButton
 aButton ButtonClick
END //"Нажать кнопку"

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

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