Песочницы
Песочницы устраняют необходимость отслеживания каждого созданного фейка, что значительно упрощает очистку.
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 появилось в целевом объекте; вам также нужно установить 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/v11/sandbox