Spec-Zone.ru › Sinon.JS 5

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

При установке в «true», будет автоматически отвечать на каждый запрос после таймаута.

По умолчанию таймаут — 10мс, но вы можете настроить его через свойство autoRespondAfter.

Обратите внимание, что эта функция предназначена для помощи в разработке макетов и не подходит для использования в тестах. Для синхронного немедленного ответа используйте respondImmediately вместо этого.

server.autoRespondAfter = ms;

Заставляет сервер автоматически отвечать на входящие запросы после таймаута.

server.respondImmediately = true;

Если установлено в «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.
http://sinonjs.org/releases/v5.1.0/fake-xhr-and-server

Spec-Zone.ru

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