назад до уроку

Декоратор-шпигун

важливість: 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;
}

Відкрити рішення із тестами в пісочниці.