Decorador espía
importancia: 5
Cree un decorador spy(func)
que devuelva un contenedor el cual guarde todas las llamadas a la función en su propiedad calls
Cada llamada se guarda como un array de argumentos.
Por ejemplo
function work(a, b) {
alert( a + b ); // work es una función o método arbitrario
}
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.D Ese decorador a veces es útil para pruebas unitarias. Su forma avanzada es sinon.spy
en la librería Sinon.JS.
El contenedor devuelto por spy(f)
debe almacenar todos los argumentos y luego usar f.apply
para reenviar la llamada.
function spy(func) {
function wrapper(...args) {
// usamos ...args en lugar de arguments para almacenar un array "real" en wrapper.calls
wrapper.calls.push(args);
return func.apply(this, args);
}
wrapper.calls = [];
return wrapper;
}