Заглушка XHR и сервер
Заглушка XMLHttpRequest
Предоставляет заглушенную реализацию XMLHttpRequest и несколько интерфейсов для манипулирования объектами, созданными с её помощью.
Также подменяет встроенные XMLHttpRequest и ActiveXObject (если доступны, и только для XMLHTTP progids). Помогает тестировать запросы, выполненные с помощью XHR.
При заглушении XHR в IE также требуется sinon-ie.js, который следует загрузить после sinon.js.
Заглушенный сервер и XHR могут быть использованы полностью автономно, загрузив sinon-server.js.
При использовании заглушенного сервера в IE также требуется sinon-ie.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.setResponseHeaders(object);`
Устанавливает заголовки ответа (например, { "Content-Type": "text/html", /* ... */ }, обновляет свойство readyState и вызывает onreadystatechange.
request.setResponseBody(body);
Устанавливает тело ответа, обновляет свойство readyState и вызывает onreadystatechange.
Кроме того, заполняет responseXML разобранным документом, если заголовки ответа об этом указывают.
request.respond(status, headers, body);`
Вызывает две предыдущие функции и устанавливает свойства status и statusText.
Статус должен быть числом, текст статуса ищется в sinon.FakeXMLHttpRequest.statusCodes.
Boolean request.autoRespond
При установке значения true, заставляет сервер автоматически отвечать на входящие запросы после таймаута.
Значение таймаута по умолчанию составляет 10 мс, но вы можете его контролировать через свойство autoRespondAfter.
Обратите внимание, что эта функция предназначена для помощи при разработке макетов и не подходит для использования в тестах.
Number request.autoRespondAfter
Если autoRespond установлено в true, отвечает на запросы после этого количества миллисекунд. Значение по умолчанию — 10.
Заглушенный сервер
API высокого уровня для работы с экземплярами FakeXMLHttpRequest.
Для помощи в обработке JSON-P, см. наши примечания ниже
{
setUp: function () {
this.server = sinon.fakeServer.create();
},
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" }]);
}
}
var server = sinon.fakeServer.create([config]);`
Создает новый сервер.
Эта функция также вызывает sinon.useFakeXMLHttpRequest().
create принимает необязательные свойства для настройки заглушенного сервера. См. параметры конфигурации ниже.
var server = sinon.fakeServerWithClock.create();
Создает сервер, который также управляет заглушенными таймерами.
Это полезно при тестировании объектов XHR созданных, например, с помощью jQuery 1.3.x, которые используют таймер для опроса объекта о завершении, а не обычный onreadystatechange.
server.configure(config);
Настраивает заглушенный сервер.
См. параметры конфигурации ниже.
server.respondWith(response);
Заставляет сервер отвечать на любой запрос, не соответствующий другому ответу, предоставленными данными. Значение по умолчанию для catch-all ответа — [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.
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
Вы также можете передать параметры в виде объекта для fakeServer.create и .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/v1.17.7/fake-xhr-and-server