Spec-Zone.ru › Sinon.JS 12

Песочницы

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

var sandbox = require("sinon").createSandbox();
var myAPI = { hello: function () {} };

describe("myAPI.hello method", function () {
  beforeEach(function () {
    // stub out the `hello` method
    sandbox.stub(myAPI, "hello");
  });

  afterEach(function () {
    // completely restore all fakes created through the sandbox
    sandbox.restore();
  });

  it("should be called once", function () {
    myAPI.hello();
    sandbox.assert.calledOnce(myAPI.hello);
  });

  it("should be called twice", function () {
    myAPI.hello();
    myAPI.hello();
    sandbox.assert.calledTwice(myAPI.hello);
  });
});

API песочницы

По умолчанию песочница

Начиная с sinon@5.0.0, объект sinon является песочницей по умолчанию. Если у вас не очень сложная настройка или вам не нужна специальная конфигурация, то, скорее всего, вам нужно использовать только ее.

const myObject = {
  hello: "world",
};

sinon.stub(myObject, "hello").value("Sinon");

console.log(myObject.hello);
// Sinon

sinon.restore();
console.log(myObject.hello);
// world

var sandbox = sinon.createSandbox();

Создаёт новый объект песочницы со шпионами, заглушками и моделями.

var sandbox = sinon.createSandbox(config);

Метод sinon.createSandbox(config) часто используется как интеграционная функция и может применяться в сценариях, включающих глобальный объект для координации всех фейков.

Песочницы по умолчанию частично настроены таким образом, что вызов:

var sandbox = sinon.createSandbox({});

будет включать дополнительные значения по умолчанию, аналогично:

var sandbox = sinon.createSandbox({
  // ...
  injectInto: null,
  properties: ["spy", "stub", "mock"],
  useFakeTimers: false,
  useFakeServer: false,
});

Значения useFakeTimers и useFakeServers установлены в false, в отличие от значений по умолчанию в файле sinon.defaultConfig:

sinon.defaultConfig = {
  // ...
  injectInto: null,
  properties: ["spy", "stub", "mock", "clock", "server", "requests"],
  useFakeTimers: true,
  useFakeServer: true,
};

Чтобы получить полную песочницу с заглушками, шпионами и т. д. и фейковыми таймерами и серверами, можно вызвать:

// Inject the sinon defaults explicitly.
var sandbox = sinon.createSandbox(sinon.defaultConfig);

// (OR) Add the extra properties that differ from the sinon defaults.
var sandbox = sinon.createSandbox({
  useFakeTimers: true,
  useFakeServer: true,
});
injectInto

Методы песочницы могут быть вставлены в другой объект для удобства. Параметр конфигурации injectInto может задавать объект, к которому будут добавлены свойства.

properties

Какие свойства вставить. Обратите внимание, что только указание «server» здесь недостаточно для того, чтобы свойство server появилось в целевом объекте, вам также необходимо установить useFakeServer на true.

Список свойств, которые можно вставить, — это те, что показаны объектом, возвращаемым функцией inject, а именно:

{
  //...
  properties: [
    "spy",
    "stub",
    "mock",
    "createStubInstance",
    "fake",
    "replace",
    "replaceSetter",
    "replaceGetter",
    "clock",
    "server",
    "requests",
    "match",
  ];
}
useFakeTimers

Если установлено значение true, в песочницу будет добавлено свойство clock. Можно дополнительно передать объект конфигурации, который соответствует спецификации для фейковых таймеров, например, { toFake: ["setTimeout", "setInterval"] }.

useFakeServer

Если true, в песочницу будут добавлены свойства server и requests. Также может быть передан объект для использования в фейковом сервере. Значение по умолчанию — sinon.fakeServer, но если вы используете jQuery 1.3.x или какую-либо другую библиотеку, которая не устанавливает обработчик onreadystatechange для XHR, вам может потребоваться выполнить:

sinon.config = {
  useFakeServer: sinon.fakeServerWithClock,
};
пример экспонирования песочницы

Для создания объекта sandboxFacade, который получит вставленный метод spy, можно написать:

// object that will have the spy method injected into it
var sandboxFacade = {};

// create sandbox and inject properties (in this case spy) into sandboxFacade
var sandbox = sinon.createSandbox({
  injectInto: sandboxFacade,
  properties: ["spy"],
});

sandbox.assert();

Удобная ссылка на sinon.assert

Начиная с sinon@2.0.0

sandbox.replace(object, property, replacement);

Заменяет свойство property объекта object на значение replacement аргумента. Попытка заменить уже заменённое значение приведёт к исключению. Возвращает заменённое replacement.

replacement может быть любым значением, включая spies, stubs и fakes.

Этот метод работает только с несвойственными свойствами. Для замены свойств-акцессоров используйте sandbox.replaceGetter() и sandbox.replaceSetter().

var myObject = {
  myMethod: function () {
    return "apple pie";
  },
};

sandbox.replace(myObject, "myMethod", function () {
  return "strawberry";
});

console.log(myObject.myMethod());
// strawberry

sandbox.replaceGetter();

Заменяет геттер для свойства property объекта object на значение replacement аргумента. Попытка заменить уже заменённый геттер приведёт к исключению.

replacement должен быть Function, и может быть экземпляром spies, stubs и fakes.

var myObject = {
    get myProperty: function() {
        return 'apple pie';
    }
};

sandbox.replaceGetter(myObject, 'myProperty', function () {
    return 'strawberry';
});

console.log(myObject.myProperty);
// strawberry

sandbox.replaceSetter();

Заменяет сеттер для свойства property объекта object на значение replacement аргумента. Попытка заменить уже заменённый сеттер приведёт к исключению.

replacement должен быть Function, и может быть экземпляром spies, stubs и fakes.

var object = {
  set myProperty(value) {
    this.prop = value;
  },
};

sandbox.replaceSetter(object, "myProperty", function (value) {
  this.prop = "strawberry " + value;
});

object.myProperty = "pie";

console.log(object.prop);
// strawberry pie

sandbox.spy();

Работает точно так же, как sinon.spy

sandbox.createStubInstance();

Работает почти так же, как sinon.createStubInstance, только также добавляет возвращённые заглушки во внутренний набор фейков для восстановления через sandbox.restore().

sandbox.stub();

Работает точно так же, как sinon.stub.

Заглушка несвойственного свойства
const myObject = {
  hello: "world",
};

sandbox.stub(myObject, "hello").value("Sinon");

console.log(myObject.hello);
// Sinon

sandbox.restore();
console.log(myObject.hello);
// world

sandbox.mock();

Работает точно так же, как sinon.mock

sandbox.useFakeTimers();

Имитирует таймеры и связывает объект clock с песочницей, так что он также восстанавливается при вызове sandbox.restore().

Доступ через sandbox.clock.

sandbox.useFakeXMLHttpRequest();

Имитирует XHR и связывает полученный объект с песочницей, так что он также восстанавливается при вызове sandbox.restore().

Начиная с версии 2.x, вы больше не можете получить доступ к запросам через sandbox.requests - используйте sandbox.useFakeServer для этого. Эта функция соответствует sinon.useFakeXMLHttpRequest, только с песочницей.

sandbox.useFakeServer();

Имитирует XHR и связывает объект сервера с песочницей, так что он также восстанавливается при вызове sandbox.restore().

Доступ к запросам через sandbox.requests и серверу через sandbox.server

sandbox.usingPromise(promiseLibrary);

Заставляет все заглушки и модели, созданные из песочницы, возвращать обещания с использованием определённой библиотеки обещаний вместо глобальной, когда используется stub.rejects или stub.resolves. Возвращает заглушку для возможности цепочки.

Начиная с sinon@2.0.0

sandbox.restore();

Восстанавливает все фейки, созданные через песочницу.

sandbox.reset();

Сбрасывает внутреннее состояние всех фейков, созданных через песочницу.

sandbox.resetBehavior();

Сбрасывает поведение всех заглушек, созданных через песочницу.

Начиная с sinon@2.0.0

sandbox.resetHistory();

Сбрасывает историю всех заглушек, созданных через песочницу.

Начиная с sinon@2.0.0

sandbox.verify();

Проверяет все модели, созданные через песочницу.

sandbox.verifyAndRestore();

Проверяет все модели и восстанавливает все фейки, созданные через песочницу.

sandbox.leakThreshold

Получает/устанавливает порог, при достижении которого выводится предупреждение о утечке памяти.

© 2010–2022 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v12/sandbox

Spec-Zone.ru

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