regresar a la lección

Decorador espía

importancia: 5

Cree un decorador spy(func) que debería devolver un contenedor que guarde todas las llamadas para que funcionen 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.

Abrir en entorno controlado con pruebas.

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) {
    // 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;
}

Abrir la solución con pruebas en un entorno controlado.