Jasmine представляет собой популярный фреймворк для тестирования JavaScript-программ, ориентированный на поведение (Behavior-Driven Development — BDD). Он предоставляет удобный и простой в использовании API, который позволяет разработчикам писать тесты для своих приложений. В этой главе рассматривается ключевая часть фреймворка — его программный API, который используется для создания, организации и выполнения тестов.
Jasmine API состоит из нескольких основных методов, которые
используются для организации тестов и работы с ними. Это такие методы,
как describe, it, beforeEach,
afterEach, expect и другие.
describeМетод describe используется для группировки связанных
тестов. Он позволяет создавать блоки, в которые помещаются несколько
тестов, что помогает структурировать код и улучшить читаемость
тестов.
describe('Математические операции', function() {
it('должен возвращать правильный результат при сложении', function() {
expect(2 + 3).toBe(5);
});
it('должен возвращать правильный результат при вычитании', function() {
expect(5 - 3).toBe(2);
});
});
describe принимает два аргумента: строку, описывающую
группу тестов, и функцию, которая определяет сами тесты.
itМетод it используется для определения отдельного теста.
Он принимает строку с описанием теста и функцию, которая содержит логику
самого теста.
it('должен проверять равенство двух чисел', function() {
expect(5).toBe(5);
});
Тесты, определённые с помощью it, могут использовать
различные матчеры (например, toBe, toEqual,
toBeTruthy), которые определяют, что именно проверяется в
тестируемой функции.
beforeEach и
afterEachМетоды beforeEach и afterEach предоставляют
возможность выполнения действий до и после каждого теста соответственно.
Это особенно полезно для подготовки данных или очищения состояния между
тестами.
describe('Классы и объекты', function() {
let obj;
beforeEach(function() {
obj = { a: 1, b: 2 };
});
afterEach(function() {
obj = null;
});
it('должен проверять правильность значений', function() {
expect(obj.a).toBe(1);
expect(obj.b).toBe(2);
});
});
beforeEach выполняется перед каждым тестом, а
afterEach — после каждого. Эти методы полезны, когда
необходимо восстановить состояние тестируемого объекта.
beforeAll и
afterAllМетоды beforeAll и afterAll работают
аналогично beforeEach и afterEach, но
выполняются только один раз для всего блока describe, а не
для каждого теста.
describe('Тестирование API', function() {
let api;
beforeAll(function() {
api = new ApiClient();
});
afterAll(function() {
api.close();
});
it('должен получать данные с сервера', function() {
expect(api.getData()).toBeDefined();
});
});
Эти методы полезны для настройки и очистки, которая нужна один раз для всех тестов в группе.
Jasmine предоставляет несколько матчеров для проверки значений. Основные из них:
toBe(value) — проверяет, равны ли два значения (по
ссылке для объектов).toEqual(value) — проверяет, равны ли два значения по
содержимому.toBeTruthy() — проверяет, что значение является
истинным.toBeFalsy() — проверяет, что значение является
ложным.toContain(value) — проверяет, что массив или строка
содержит определённое значение.toThrow() — проверяет, что функция выбрасывает
исключение.Пример:
it('должен проверять, что значение является истинным', function() {
let val = true;
expect(val).toBeTruthy();
});
Jasmine поддерживает тестирование асинхронного кода с использованием
done. Для асинхронных операций в тестах нужно вызвать
done() в конце функции, чтобы сигнализировать Jasmine о
завершении асинхронной операции.
it('должен загружать данные с сервера', function(done) {
api.getData().then(function(data) {
expect(data).toBeDefined();
done();
});
});
Этот подход используется для тестирования функций, которые работают с промисами или другими асинхронными операциями.
Jasmine также поддерживает моки и шпионов, которые используются для тестирования взаимодействий между объектами и функциями.
Шпион — это объект, который позволяет отслеживать вызовы функций,
параметры и возвращаемые значения. Для создания шпионов используется
метод spyOn.
it('должен проверять вызов метода', function() {
let obj = {
greet: function(name) {
return 'Hello ' + name;
}
};
spyOn(obj, 'greet');
obj.greet('John');
expect(obj.greet).toHaveBeenCalledWith('John');
});
Метод spyOn создаёт шпион на указанном методе объекта и
позволяет отслеживать, был ли он вызван, сколько раз и с какими
параметрами.
Мок — это объект, который заменяет реальные объекты или функции в тестах. Моки часто используются для тестирования внешних зависимостей, таких как API или базы данных.
Jasmine предоставляет метод mock для создания таких
объектов, но чаще всего моки создаются вручную, используя шпионов.
Jasmine также поддерживает различные настройки, которые позволяют
изменять поведение фреймворка. Для этого используется объект
конфигурации jasmine.getEnv().
jasmine.getEnv().addReporter(new jasmine.ConsoleReporter());
Этот код добавляет консольный репортер, который будет выводить информацию о выполнении тестов.
Для настройки времени тайм-аутов и других параметров используется
объект jasmine.DEFAULT_TIMEOUT_INTERVAL.
jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
Эти настройки позволяют гибко управлять процессом тестирования и адаптировать Jasmine под нужды проекта.
Jasmine предоставляет мощный и гибкий API, который подходит как для простых, так и для сложных проектов. Грамотное использование методов, матчеров и вспомогательных функций позволяет создавать тесты, которые легко поддерживать и расширять. Программный API Jasmine охватывает все аспекты тестирования, от организации тестов до работы с асинхронным кодом и создания моков и шпионов, что делает его незаменимым инструментом для современных JavaScript-разработчиков.