Моделирование
Введение
fake доступен в Sinon начиная с версии 5. Он позволяет создавать fake Function с возможностью установки поведения по умолчанию. Установите поведение, используя Functions с тем же API, что и в sinon.stub. Созданное fake Function, с поведением или без него, имеет тот же API, что и (sinon.spy)шпионы.
В Sinon, fake — это Function, который записывает аргументы, возвращаемое значение, значение this и сгенерированное исключение (если таковое имеется) для всех вызовов.
Моделирование неизменяемо: после создания поведение не изменится.
В отличие от sinon.spy и sinon.stub методов, API sinon.fake знает только как создавать модели, и не занимается их подключением к системе, на которой проводятся тесты. Для подключения моделей к системе под тестированием вы можете использовать методы sinon.replace*.
Создание модели
Создайте fake Function с поведением или без него. Созданная Function имеет тот же API, что и sinon.spy.
Создание модели без поведения
// create a basic fake, with no behavior var fake = sinon.fake(); fake(); // undefined fake.callCount; // 1
Создание модели с пользовательским поведением
// create a fake that returns the text "foo"
var fake = sinon.fake.returns('foo');
fake()
// foo
Модели с поведением
Модели не могут быть изменены после создания с поведением.
sinon.fake.returns(value);
Создает модель, которая возвращает переданный value аргумент.
var fake = sinon.fake.returns('apple pie');
fake();
// apple pie
sinon.fake.throws(value);
Создает модель, которая выбрасывает исключение Error со значением, переданным в качестве свойства message.
Если в качестве аргумента Error передается value, то это значение будет значением свойства 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 предоставление поведения.
Созданная fake Function имеет тот же API, что и sinon.spy.
Это полезно, когда требуется сложное поведение, не покрываемое методами sinon.fake.*, или при обёртке существующей функции или метода.
Свойства экземпляра
Свойства экземпляра такие же, как у sinon.spy.
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.firstArg
Это свойство для удобства получения ссылки на первый аргумент, переданный в последний вызов модели.
var f = sinon.fake(); var date1 = new Date(); var date2 = new Date(); f(date1, 1, 2); f(date2, 1, 2); f.firstArg === date2; // 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/v9.2.2/fakes