Spec-Zone.ru › Sinon.JS 9

Фейковый 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 может быть тремя вещами:

  1. Строка, представляющая тело ответа
  2. Объект с кодом состояния, заголовками и телом ответа, например, [200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"]
  3. Функция.

Значение состояния по умолчанию - 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/v9.2.2/fake-xhr-and-server

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API