Фейковый 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 (новинка в версии 1.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–2018 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v6.3.5/fake-xhr-and-server