Spec-Zone.ru › Sinon.JS 7

Фейковый XHR и сервер

Фейковый XMLHttpRequest

Предоставляет фейковую реализацию XMLHttpRequest и несколько интерфейсов для манипулирования объектами, созданными с её помощью.

Также эмулирует встроенные XMLHttpRequest и ActiveXObject (если доступны, и только для XMLHTTP progid). Помогает при тестировании запросов, выполненных с помощью 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, этот конструктор заменяется, и для progIds XMLHTTP возвращаются фейковые объекты. Другие 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 может быть одним из трёх:

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

По умолчанию статус — 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/v7.5.0/fake-xhr-and-server

Spec-Zone.ru

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