Декоратор-шпигун
важливість: 5
Створіть декоратор spy(func)
, який повинен повернути обгортку, яка зберігає всі виклики функції у властивості calls
.
Кожен виклик зберігається як масив аргументів.
For instance:
function work(a, b) {
alert( a + b ); // працює як довільна функція або метод
}
work = spy(work);
work(1, 2); // 3
work(4, 5); // 9
for (let args of work.calls) {
alert( 'виклик:' + args.join() ); // "виклик:1,2", "виклик:4,5"
}
P.S. Цей декоратор іноді корисний для unit-тестування. Його просунута форма – sinon.spy
у бібліотеці Sinon.JS.
Обгортка, що повертається за допомогою spy(f)
, повинна зберігати всі аргументи, а потім використовувати f.apply
, щоб переадресувати виклик.
function spy(func) {
function wrapper(...args) {
// using ...args instead of arguments to store "real" array in wrapper.calls
wrapper.calls.push(args);
return func.apply(this, args);
}
wrapper.calls = [];
return wrapper;
}