Spec-Zone.ru › Sinon.JS 2

Фейковый 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.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" }]);

        assert(server.requests.length > 0)
    }
}

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);

Заставляет сервер отвечать на любой запрос, не сопоставленный с другим ответом, с предоставленными данными. По умолчанию фейковый ответ - [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+

Если ответ - функция, она будет получать любые capture groups из регулярного выражения вместе с объектом 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

Также вы можете передать параметры с помощью литерала объекта в 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/v2.4.1/fake-xhr-and-server

Spec-Zone.ru

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