retour au cours

Décorateur spy

importance: 5

Créez un décorateur spy(func) qui devrait renvoyer un wrapper qui enregistre tous les appels à la fonction dans sa propriété calls.

Chaque appel est enregistré sous la forme d’un tableau d’arguments.

Par exemple:

function work(a, b) {
  alert( a + b ); // work est une fonction ou une méthode arbitraire
}

work = spy(work);

work(1, 2); // 3
work(4, 5); // 9

for (let args of work.calls) {
  alert( 'call:' + args.join() ); // "call:1,2", "call:4,5"
}

P.S. Ce décorateur est parfois utile pour les tests unitaires. Sa forme avancée est sinon.spy dans la bibliothèque Sinon.JS.

Open a sandbox with tests.

Le wrapper renvoyé par spy(f) doit stocker tous les arguments, puis utiliser f.apply pour transférer l’appel.

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;
}

Ouvrez la solution avec des tests dans une sandbox.