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.