Объекты Spy¶
Объекты Spy фреймворка Jasmine занимают важное место в тестировании Angular приложений. Они позволяют эмулировать вызовы функций и использование объектов без вызова оригинальной функции и без создания экземпляра класса объекта.
Объекты класса Spy не создаются напрямую. Для этого имеются функции:
spyOn()— отслеживает состояния и использование методов объекта;spyOnProperty()— используется для отслеживания состояния и использования свойств объекта;jasmine.createSpy— создает функцию, у которой нет определения;jasmine.createSpyObj— создает объект-заглушку.
Функция Jasmine spyOn() используется для реально существующих методов класса. Принимает два параметра — экземпляр класса и имя отслеживаемого метода.
1 2 | |
Теперь можно управлять методом getData() и отслеживать все его действия с помощью методов класса Spy.
1 2 3 4 5 6 7 | |
Метод returnValue() принимает значение, которое будет возвращено методом при следующем его вызове. При этом оригинальный метод не будет вызван.
Для проверки осуществления вызова метода в jasmine имеется функция toHaveBeenCalled(). Более точная информация о вызовах метода содержится в свойстве calls самого объекта Spy. Например, можно точно узнать, сколько раз вызывали метод с помощью функции count() или узнать все о его последнем вызове используя mostRecent().
Для сброса статистики вызовов и использования метода используйте reset() объекта calls.
1 | |
Теперь рассмотрим пример с вызовом оригинальной функции.
1 2 | |
Функция callThrough() вызывает метод класса напрямую. Проверить переданные аргументы можно используя функцию toHaveBeenCalledWith().
Для вызова при обращении к методу функции, отличной от оригинального определения, используется метод callFake().
1 2 3 4 5 | |
Пример проверки на генерацию исключения.
1 2 3 4 | |
Для сброса всех установленных ранее значений с помощью функций returnValue(), callThrough(), callFake(), throwError() и т. д. имеется функция stub().
1 | |
spyOnProperty() схож с функцией spyOn(), только используется для отслеживания использования свойств объекта и принимает три параметра:
- объект класса;
- имя свойства объекта;
- модификатор доступа — может быть 'get' или 'set' (по умолчанию 'get').
Практическое применение идентично spyOn().
1 2 3 4 5 6 7 8 9 | |
В отличие от spyOn() jasmine.createSpy предназначен для неопределенных функций. Другими словами, функция создает объект Spy, позволяющий отслеживать обращения к методу, который на самом деле не существует.
jasmine.createSpy() принимает единственный аргумент — имя несуществующей функции.
1 2 3 4 5 | |
jasmine.createSpyObj() позволяет создать новый объект класса с набором уже отслеживаемых методов.
Первый параметр — имя класса, второй — массив методов, либо же объект, ключи которого это имена методов, а их значения — возвращаемые по умолчанию соответствующими методами данные.
Пример создания объекта Spy с помощью jasmine.createSpyObj:
1 2 3 4 | |
или
1 2 3 4 | |
Теперь можно отслеживать сразу метод getData() и метод getValue(). Предположим, что exampleSpy создавался первым способом.
1 2 3 4 5 6 7 | |
Если же exampleSpy был определен со значениями методов по умолчанию, то можно сразу проверить возвращаемое значение.
1 2 3 4 5 | |