Фейковый 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 для эмуляции или частичной интеграции/функционального тестирования, вы, возможно, захотите фейкнуть некоторые запросы, а другие позволить проходить на сервер. С отфильтрованными 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 может быть тремя вещами:
Stringпредставляющий тело ответа- Объект
Arrayсо статусом, заголовками и телом ответа, например,[200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"] Function.
Значение статуса по умолчанию - 200, а заголовки по умолчанию - пустые.
Если ответ - Function, он получит объект запроса. Вам нужно будет вручную вызвать respond на нём, чтобы завершить запрос.
server.respondWith(url, response);
Отвечает на все запросы на указанный URL, например, /posts/1.
server.respondWith(method, url, response);
Отвечает на все запросы method на указанный URL с предоставленным ответом.
method — HTTP-глагол.
server.respondWith(urlRegExp, response);
URL может быть регулярным выражением, например, /\\/post\\//\\d+
Если ответ - Function, он получит любые группы захвата из регулярного выражения вместе с объектом 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–2017 Christian Johansen
Licensed under the BSD License.
http://sinonjs.org/releases/v3.3.0/fake-xhr-and-server