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