Поддельный XHR и сервер
Поддельный XMLHttpRequest
Предоставляет поддельную реализацию XMLHttpRequest и несколько интерфейсов для манипулирования объектами, созданными с её помощью.
Также подделывает родные XMLHttpRequest и ActiveXObject (если доступны и только для XMLHTTP progids). Помогает при тестировании запросов, выполненных с помощью XHR.
Поддельный сервер и XHR могут быть использованы полностью автономно, загрузив sinon-server.js.
{
setUp: function () {
this.xhr = sinon.useFakeXMLHttpRequest();
var requests = this.requests = [];
this.xhr.onCreate = function (xhr) {
requests.push(xhr);
};
},
tearDown: function () {
this.xhr.restore();
},
"test should fetch comments from server" : function () {
var callback = sinon.spy();
myLib.getCommentsFor("/some/article", callback);
assertEquals(1, this.requests.length);
this.requests[0].respond(200, { "Content-Type": "application/json" },
'[{ "id": 12, "comment": "Hey there" }]');
assert(callback.calledWith([{ id: 12, comment: "Hey there" }]));
}
}
sinon.useFakeXMLHttpRequest
var xhr = sinon.useFakeXMLHttpRequest();
Заставляет Sinon заменить родной объект XMLHttpRequest в браузерах, которые его поддерживают, на пользовательскую реализацию, которая не отправляет реальных запросов.
В браузерах, поддерживающих ActiveXObject, этот конструктор заменяется, а для XMLHTTP progIds возвращаются поддельные объекты. Другие progIds, такие как XMLDOM, остаются без изменений.
Родной объект XMLHttpRequest будет доступен по адресу sinon.xhr.XMLHttpRequest
xhr.onCreate = function (xhr) {};
Назначив функцию свойству onCreate возвращаемого объекта из useFakeXMLHttpRequest(), вы можете подписаться на вновь созданные объекты FakeXMLHttpRequest. API поддельного объекта xhr см. ниже.
Использование этого наблюдателя означает, что вы все еще можете получить доступ к объектам, созданным, например, jQuery.ajax (или другими абстракциями/фреймворками).
xhr.restore();
Восстановить исходную функцию(и).
FakeXMLHttpRequest
String request.url
URL, заданный в объекте запроса.
String request.method
Метод запроса в виде строки.
Object request.requestHeaders
Объект всех заголовков запроса, например:
{
"Accept": "text/html, */*",
"Connection": "keep-alive"
}
String request.requestBody
Тело запроса
int request.status
Код состояния запроса.
undefined если запрос еще не обработан (см. respond ниже)
String request.statusText
Заполняется только при вызове метода respond (см. ниже).
boolean request.async
Является ли запрос асинхронным.
String request.username
Имя пользователя, если есть.
String request.password
Пароль, если есть.
Document request.responseXML
При использовании respond, это свойство заполняется разборкой документа, если заголовки ответа указывают на это (см. спецификацию)
String request.getResponseHeader(header);
Значение заданного заголовка ответа, если на запрос получен ответ (см. respond).
Object request.getAllResponseHeaders();
Все заголовки ответа как объект.
Отфильтрованные запросы
При использовании Sinon.JS для макетов или частичного интегрирования/функционального тестирования, вы можете захотеть подделать некоторые запросы, разрешая другим проходить на сервер backend. С отфильтрованными FakeXMLHttpRequest (впервые в v1.3.0), вы можете это сделать.
FakeXMLHttpRequest.useFilters
Значение по умолчанию для false.
Если установлено в true, Sinon будет проверять добавленные фильтры, если определенные запросы должны быть «разподделаны»
FakeXMLHttpRequest.addFilter(fn)
Добавить фильтр, который определит, подделывать ли запрос.
Фильтр вызывается при вызове xhr.open, с точно такими же аргументами (method, url, async, username, password). Если фильтр возвращает true, запрос не будет подделан.
Моделирование ответов сервера
request.setStatus(status);
Устанавливает код состояния ответа (status и statusText свойства).
Статус должен быть числом, текст статуса извлекается из sinon.FakeXMLHttpRequest.statusCodes.
request.setResponseHeaders(object);
Устанавливает заголовки ответа (например, { "Content-Type": "text/html", /* ... */ }, обновляет свойство readyState и вызывает onreadystatechange).
request.setResponseBody(body);
Устанавливает тело ответа, обновляет свойство readyState и вызывает onreadystatechange.
Кроме того, заполняет responseXML разборкой документа, если заголовки ответа указывают на это.
request.respond(status, headers, body);
Вызывает три вышеуказанных метода.
request.error();
Имитирует ошибку сети в запросе. Обработчик onerror будет вызван, и status будет 0.
Boolean request.autoRespond
При установке в true, заставляет сервер автоматически отвечать на входящие запросы через заданный интервал времени.
Интервал по умолчанию составляет 10 мс, но его можно настроить через свойство autoRespondAfter.
Обратите внимание, что эта функция предназначена для помощи при разработке макетов и не подходит для использования в тестах.
Number request.autoRespondAfter
Если autoRespond равно true, отвечать на запросы через это количество миллисекунд. Значение по умолчанию — 10.
Поддельный сервер
API высокого уровня для манипулирования экземплярами FakeXMLHttpRequest.
Для получения помощи по обработке JSON-P, пожалуйста, обратитесь к нашим примечаниям ниже.
{
setUp: function () {
this.server = sinon.createFakeServer();
},
tearDown: function () {
this.server.restore();
},
"test should fetch comments from server" : function () {
this.server.respondWith("GET", "/some/article/comments.json",
[200, { "Content-Type": "application/json" },
'[{ "id": 12, "comment": "Hey there" }]']);
var callback = sinon.spy();
myLib.getCommentsFor("/some/article", callback);
this.server.respond();
sinon.assert.calledWith(callback, [{ id: 12, comment: "Hey there" }]);
assert(server.requests.length > 0)
}
}
var server = sinon.createFakeServer([config]);
Создаёт новый сервер.
Эта функция также вызывает sinon.useFakeXMLHttpRequest().
createFakeServer принимает необязательные свойства для настройки поддельного сервера. Параметры конфигурации см. в разделе настройки ниже.
var server = sinon.createFakeServerWithClock();
Создаёт сервер, который также управляет поддельными таймерами.
Это полезно при тестировании объектов XHR , созданных, например, с помощью jQuery 1.3.x, который использует таймер для опроса объекта на завершение, а не обычный onreadystatechange.
server.configure(config);
Настраивает поддельный сервер.
Параметры конфигурации см. в разделе настройки ниже.
server.respondWith(response);
Заставляет сервер отвечать на любой запрос, не соответствующий другому ответу, с предоставленными данными. Ответом по умолчанию для всех случаев является [404, {}, ""].
response может быть одним из трёх:
- Строка, представляющая тело ответа
- Объект со статусом, заголовками и телом ответа, например
[200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"] - Функция.
Статус по умолчанию — 200, заголовки по умолчанию — отсутствуют.
Когда ответ является функцией, она получает объект запроса. Вы должны вручную вызвать respond на ней, чтобы завершить запрос.
server.respondWith(url, response);
Отвечает на все запросы на данный URL, например /posts/1.
server.respondWith(method, url, response);
Отвечает на все запросы method на данный URL с данным ответом.
method — это HTTP-метод.
server.respondWith(urlRegExp, response);
URL может быть регулярным выражением, например /\\/post\\//\\d+
Если ответ является функцией, она получает любые группы захвата из регулярного выражения вместе с объектом XMLHttpRequest:
server.respondWith(/\/todo-items\/(\d+)/, function (xhr, id) {
xhr.respond(200, { "Content-Type": "application/json" }, '[{ "id": ' + id + " }]");
});
server.respondWith(method, urlRegExp, response);
Отвечает на все запросы method на URL, соответствующие регулярному выражению.
server.respond();
Принуждает все очереди асинхронных запросов получить ответ.
Если ни один из ответов, добавленных с помощью respondWith, не соответствует, используется ответ по умолчанию [404, {}, ""].
Синхронные запросы обрабатываются немедленно, поэтому убедитесь, что вы вызываете respondWith заранее.
Если вызов содержит аргументы, respondWith вызывается с этими аргументами перед ответом на запросы.
server.autoRespond = true;
Если установлено, будет автоматически отвечать на каждый запрос через интервал.
Интервал по умолчанию составляет 10 мс, но его можно настроить через свойство autoRespondAfter.
Обратите внимание, что эта функция предназначена для помощи при разработке макетов и не подходит для использования в тестах. Для немедленного синхронного ответа используйте respondImmediately вместо этого.
server.autoRespondAfter = ms;
Заставляет сервер автоматически отвечать на входящие запросы через интервал времени.
server.respondImmediately = true;
Если установлено, сервер будет сразу же и синхронно отвечать на каждый запрос.
Это идеально подходит для подделки сервера внутри теста без необходимости вызывать server.respond() после каждого запроса, отправленного в этом тесте.
Поскольку это синхронно и немедленно, это не подходит для имитации реальной задержки сети в тестах или макетах. Для имитации задержки сети с автоматическими ответами см. server.autoRespond и server.autoRespondAfter.
массив server.requests
Вы можете проверить server.requests для проверки порядка запросов, поиска несоответствующих запросов или проверки того, что запросов не было. server.requests — это массив всех созданных объектов FakeXMLHttpRequest.
Boolean server.fakeHTTPMethods
Если установлено в true, сервер найдёт параметр _method в теле POST и определит его как фактический метод.
Поддерживает паттерн, распространённый в приложениях Ruby on Rails. Для подделки пользовательских HTTP-методов переопределите server.getHTTPMethod(request).
server.getHTTPMethod(request)
Используется в качестве внутреннего метода для определения HTTP-метода, используемого с предоставленным запросом.
По умолчанию этот метод возвращает request.method. Когда server.fakeHTTPMethods имеет значение true, метод вернёт значение параметра _method если метод является “POST”.
Этот метод может быть переопределён для обеспечения пользовательского поведения.
server.restore();
Восстанавливает родной конструктор XHR.
Настройки поддельного сервера
Эти настройки — свойства объекта сервера и могут быть установлены напрямую
server.autoRespond = true
Вы также можете передать настройки с помощью объекта литерала в createFakeServer и .configure.
Boolean autoRespond
Если установлено, будет автоматически отвечать на каждый запрос через интервал.
Интервал по умолчанию составляет 10 мс, но его можно настроить через свойство autoRespondAfter.
Обратите внимание, что эта функция предназначена для помощи при разработке макетов и не подходит для использования в тестах.
Для немедленного синхронного ответа используйте respondImmediately вместо этого.
Number autoRespondAfter (ms)
Заставляет сервер автоматически отвечать на входящие запросы через интервал времени.
Boolean respondImmediately
Если установлено, сервер будет отвечать на каждый запрос немедленно и синхронно.
Это идеально подходит для имитации сервера внутри теста, без необходимости вызова server.respond() после каждого запроса, сделанного в этом тесте.
Поскольку это синхронно и немедленно, это не подходит для моделирования реальной задержки сети в тестах или макетах. Чтобы смоделировать задержку сети с автоматическими ответами, см. server.autoRespond и server.autoRespondAfter.
boolean fakeHTTPMethods
Если установлено значение true, сервер найдет параметр _method в теле POST и распознает его как фактический метод.
Поддерживает шаблон, распространенный в приложениях Ruby on Rails.
Для имитации пользовательских HTTP-методов переопределите server.getHTTPMethod(request)
© 2010–2020 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v8.1.1/fake-xhr-and-server