Jasmine-ajax — это плагин для библиотеки Jasmine, предназначенный для упрощения тестирования AJAX-запросов в JavaScript. С его помощью можно легко имитировать поведение HTTP-запросов и ответов, что позволяет протестировать логику работы с сервером без реального взаимодействия с сетью.
Для начала работы с плагином необходимо установить его в проект. Это можно сделать через npm или напрямую через CDN.
Установка с помощью npm:
npm install jasmine-ajax --save-devПодключение через CDN:
Если вы не используете систему сборки, можно подключить плагин
напрямую в HTML-файл с помощью тега <script>:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine-ajax/3.1.0/jasmine-ajax.min.js"></script>После установки плагин необходимо подключить в вашем тестовом файле, например, так:
import 'jasmine-ajax';
Плагин предоставляет несколько ключевых функций для работы с AJAX-запросами в тестах. Рассмотрим их более детально.
Основная задача Jasmine-ajax — это возможность мокировать AJAX-запросы. Это позволяет создавать виртуальные ответы на запросы, имитируя работу с сервером, без необходимости реального взаимодействия с API.
Для мокирования запросов используется метод
jasmine.Ajax.install(), который подключает фейковый
механизм обработки HTTP-запросов.
beforeEach(() => {
jasmine.Ajax.install();
});
afterEach(() => {
jasmine.Ajax.uninstall();
});
В beforeEach устанавливается мок, а в
afterEach удаляется, чтобы избежать утечек состояния между
тестами.
После установки мока можно отправлять AJAX-запросы, которые будут
перехвачены плагином. Рассмотрим пример простого GET-запроса с
использованием библиотеки XMLHttpRequest:
function fetchData() {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true);
xhr.send();
}
Теперь можно написать тест, который перехватит запрос и ответит на него заранее подготовленными данными:
it('должен успешно отправить GET запрос и получить данные', () => {
const mockResponse = { success: true };
fetchData();
const request = jasmine.Ajax.requests.mostRecent();
request.respondWith({
status: 200,
responseText: JSON.stringify(mockResponse),
});
expect(request.status).toBe(200);
expect(request.responseText).toBe(JSON.stringify(mockResponse));
});
Здесь:
fetchData(), которая отправляет
GET-запрос.jasmine.Ajax.requests.mostRecent() позволяет
получить последний выполненный запрос.request.respondWith() эмулирует ответ от сервера
с нужным статусом и телом ответа.Jasmine-ajax также поддерживает работу с другими типами HTTP-запросов, такими как POST, PUT, DELETE и другими. Пример с POST-запросом:
function sendData(data) {
const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/data', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(data));
}
Для тестирования POST-запроса используем аналогичный подход:
it('должен успешно отправить POST запрос с данными', () => {
const data = { userId: 123, name: 'John' };
const mockResponse = { success: true };
sendData(data);
const request = jasmine.Ajax.requests.mostRecent();
expect(request.method).toBe('POST');
expect(request.url).toBe('/api/data');
expect(request.data()).toEqual(data);
request.respondWith({
status: 200,
responseText: JSON.stringify(mockResponse),
});
expect(request.status).toBe(200);
expect(request.responseText).toBe(JSON.stringify(mockResponse));
});
Здесь:
request.data() мы проверяем отправленные
данные.respondWith(), мы проверяем корректность полученного
ответа.Иногда важно не только проверять статус ответа, но и убедиться, что соответствующие колбэки были вызваны. Это можно сделать с помощью Jasmine-спайков.
Пример:
function fetchDataWithCallback(callback) {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true);
xhr.onl oad = function () {
callback(xhr.responseText);
};
xhr.send();
}
Тест с использованием шпионов:
it('должен вызвать callback при получении ответа', () => {
const callbackSpy = jasmine.createSpy('callback');
const mockResponse = { success: true };
fetchDataWithCallback(callbackSpy);
const request = jasmine.Ajax.requests.mostRecent();
request.respondWith({
status: 200,
responseText: JSON.stringify(mockResponse),
});
expect(callbackSpy).toHaveBeenCalledWith(JSON.stringify(mockResponse));
});
В этом примере:
jasmine.createSpy().Jasmine-ajax позволяет настраивать задержки в ответах, что может быть полезно для тестирования асинхронных сценариев. Например:
it('должен обработать ответ с задержкой', (done) => {
const mockResponse = { success: true };
fetchData();
const request = jasmine.Ajax.requests.mostRecent();
request.respondWith({
status: 200,
responseText: JSON.stringify(mockResponse),
responseDelay: 1000, // Задержка в 1 секунду
});
setTimeout(() => {
expect(request.status).toBe(200);
expect(request.responseText).toBe(JSON.stringify(mockResponse));
done();
}, 1100); // Завершаем тест с учётом задержки
});
В этом примере:
responseDelay.setTimeout для проверки результата
после задержки.Эти методы являются основными инструментами для работы с моками AJAX-запросов и создания подробных тестов.
Jasmine-ajax значительно упрощает тестирование компонентов, которые взаимодействуют с сервером через AJAX-запросы. Благодаря мокированию запросов и ответов можно точно контролировать поведение приложения без необходимости реального взаимодействия с сетью. Это делает тесты более быстрыми и стабильными, а также позволяет сосредоточиться на проверке логики работы с данными, а не на внешних факторах, таких как доступность API.