Расширяем возможности стандартной библиотеки (часть 1)

TestComplete предоставляет нам весьма богатую библиотеку стандартных функций для выполнения разнообразных задач. Например, объект aqString содержит кучу методов для работы со строками, которых нет в языках программирования; объект aqTextFile позволяет выполнять разнообразные действия с текстовыми файлами; и т.д.

Однако, как это обычно бывает, предоставляемых возможностей все равно мало и мы хотим большего. В частности мы можем захотеть дополнить имеющиеся объекты своими методами, но к сожалению TestComplete не предоставляет такой возможности. Что же делать?

В этой статье мы рассмотрим простой пример расширения стандартной библиотеки своими методами.

Допустим, мы хотим добавить в модуль aqString методы Left и Right, так как их нет ни в объекте, ни в стандартной библиотеке языка JScript. Мы не можем добавить свои методы в aqString, однако мы можем создать новый класс, который будет делать то же самое, что aqString, плюс то, что нужно нам. При этом нам вовсе не придется переписывать aqString с нуля!

Для решения этой задачи мы создадим класс aqStr со статическими методами Left и Right:

function aqStr()
 { }
aqStr.Left = function(str, len)
{
  return aqString.SubString(str, 0, len);
}
aqStr.Right = function(str, len)
{
  var startPosition = aqString.GetLength(str) - len;
  return aqString.SubString(str, startPosition, len);
}

Примеры вызова этих методов:

Log.Message(aqStr.Right("123456789", 3)); // выведет 789
Log.Message(aqStr.Left("123456789", 3)); // выведет 123

А как же быть со стандартными методами объекта aqString? Очень просто: мы создадим одноименные методы в нашем классе, которые будут просто вызывать соответствующие методы объекта aqString. Например, вот так будет выглядеть объявление метода ToLower:

aqStr.ToLower = function(str)
{
  return aqString.ToLower(str);
}

Аналогичным образом необходимо объявить и все остальные методы, которые есть в объекте aqString.

Есть лишь одна загвоздка, касающаяся свойств aqString (их два: ListSeparator и QuoteSymbol). Мы не можем установить соответствие между свойством нашего класса и свойством стандартного объекта TestComplete так, чтобы они были связаны и свойство объекта aqString изменялось при изменении свойства нашего класса. Поэтому нам придется немного расширить методы, работающие с этими свойствами, таким образом, чтобы они устанавливали одноименные свойства объекта aqString перед вызовом методов. Вот как это будет выглядеть.

Сначала мы устанавливаем нужное нам свойство для класса (это необходимо сделать в том же модуле, где мы определяем методы нашего класса):

aqStr.ListSeparator = '-';

А затем в каждом методе, который работает с этим свойством, принудительно устанавливаем свойство для объекта aqString перед вызовом соответствующего метода. Например:

aqStr.GetListLength = function(List)
{
  aqString.ListSeparator = aqStr.ListSeparator;
  return aqString.GetListLength(List);
}

Таким образом в результате у нас будет класс aqStr, который полностью соответствует классу aqString, при этом дополняя его своими методами.

Для удобства можно добавить имя класса aqStr в список User Keywords, как это было описано в одной из предыдущих статей.

У такого подхода (использование классов) есть достоинства и недостатки.

Достоинства:

  • Прост в создании и сопровождении

Недостатки:

  • В редакторе нет всплывающего окошка автодополнения кода
  • Работает только для языка JScript

Поэтому в следующей статье мы рассмотрим, как получить тот же результат с помощью Script Extension.