Заглушки
Введение
fake была представлена с Sinon версии 5. Она упрощает и объединяет понятия из spies и stubs.
В Sinon, fake — это Function, которое записывает аргументы, возвращаемое значение, значение this и брошенное исключение (если таковое имеется) для всех своих вызовов.
Она может быть создана с поведением или без него; она может обернуть существующую функцию.
Заглушка неизменяема: после создания ее поведение не изменится.
В отличие от sinon.spy и sinon.stub методов, API заглушек знает только как создавать заглушки и не занимается их подстановкой в тестируемую систему. Для подстановки заглушек в тестируемую систему можно использовать методы sinon.replace*.
Создание заглушки
// create a basic fake, with no behavior var fake = sinon.fake(); fake(); console.log(fake.callCount); // 1
Заглушки с поведением
Заглушки могут быть созданы с поведением, которое нельзя изменить после создания заглушки.
sinon.fake.returns(value);
Создает заглушку, которая возвращает value аргумент
var fake = sinon.fake.returns('apple pie');
fake();
// apple pie
sinon.fake.throws(value);
Создает заглушку, которая выбрасывает Error со значением, предоставленным в качестве свойства message.
Если в качестве аргумента value передается Error, то это будет значение, которое будет выброшено. Если передано любое другое значение, оно будет использовано для свойства message выброшенного Error.
var fake = sinon.fake.throws(new Error('not apple pie'));
fake();
// Error: not apple pie
sinon.fake.resolves(value);
Создает заглушку, которая возвращает разрешенный Promise для переданного значения.
sinon.fake.rejects(value);
Создает заглушку, которая возвращает отклоненный Promise для переданного значения.
Если в качестве аргумента value передается Error, то это будет значение промиса. Если передано любое другое значение, оно будет использовано для свойства message возвращаемого Error промисом.
sinon.fake.yields([value1, ..., valueN]);
sinon.fake.yields принимает некоторые значения и возвращает функцию, которая при вызове ожидает, что последним аргументом будет коллбек, и вызывает этот коллбек с теми же ранее заданными значениями. Возвращаемая функция обычно используется для имитации функции сервиса, которая принимает коллбек в качестве последнего аргумента.
В примере кода ниже функция «readFile» модуля «fs» заменяется заглушкой, созданной с помощью sinon.fake.yields. Когда вызывается заглушка, она всегда вызывает последний полученный аргумент, который ожидается как коллбек, со значениями, которые функция yields ранее приняла.
var fake = sinon.fake.yields(null, 'file content');
sinon.replace(fs, 'readFile', fake);
fs.readFile('somefile',(err,data)=>{console.log(data);});
console.log('end of this event loop');
// file content
// end of this event loop
sinon.fake.yieldsAsync([value1, ..., valueN]);
Аналогично yields, yieldsAsync также возвращает функцию, которая при вызове ожидает, что последним аргументом будет коллбек, и вызывает этот коллбек с теми же ранее заданными значениями. Однако возвращаемая функция вызывает этот коллбек асинхронно, а не немедленно, т.е. в следующем цикле событий.
Сравните вывод примера кода ниже с выводом примера кода выше для yields чтобы увидеть разницу.
var fakeAsync = sinon.fake.yieldsAsync(null, 'file content');
sinon.replace(fs, 'readFile', fakeAsync);
fs.readFile('somefile',(err,data)=>{console.log(data);});
console.log('end of this event loop');
// end of this event loop
// file content
sinon.fake(func);
Оборачивает существующую Function для записи всех взаимодействий, оставляя за func предоставление поведения.
Это полезно, когда требуется сложное поведение, не охваченное методами sinon.fake.* или при обертке существующей функции или метода.
Свойства экземпляра
f.callback
Это свойство для удобства получения ссылки на последний коллбек, переданный в заглушку.
var f = sinon.fake();
var cb1 = function () {};
var cb2 = function () {};
f(1, 2, 3, cb1);
f(1, 2, 3, cb2);
f.callback === cb2;
// true
Такая же удобная функция добавлена для вызовов шпиона:
f.getCall(1).callback === cb2; // true // f.lastCall.callback === cb2; // true
f.lastArg
Это свойство для удобства получения ссылки на последний аргумент, переданный в заглушку.
var f = sinon.fake(); var date1 = new Date(); var date2 = new Date(); f(1, 2, date1); f(1, 2, date2); f.lastArg === date2; // true
Такая же удобная функция добавлена для вызовов шпиона:
f.getCall(0).lastArg === date1; // true f.getCall(1).lastArg === date2; // true f.lastCall.lastArg === date2; // true
Добавление заглушки в тестируемую систему
В отличие от sinon.spy и sinon.stub, sinon.fake знает только о создании заглушек, а не о замене свойств в тестируемой системе.
Для замены свойства можно использовать метод sinon.replace.
var fake = sinon.fake.returns('42');
sinon.replace(console, 'log', fake);
console.log('apple pie');
// 42
Когда необходимо восстановить измененные свойства, просто вызовите метод sinon.restore.
// restores all replaced properties set by sinon methods (replace, spy, stub) sinon.restore();
© 2010–2020 Christian Johansen
Licensed under the BSD License.
https://sinonjs.org/releases/v7.5.0/fakes