Spec-Zone.ru › Sinon.JS 14

Песочницы

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

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/v14/sandbox

Spec-Zone.ru

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