tilbage til lektionen

Spy decorator

vigtighed: 5

Opret en decorator spy(func) der returnerer en wrapper der gemmer alle kald til funktionen i dens calls egenskab.

Hvert kald er gemt som et array af argumenter.

For eksempel:

function work(a, b) {
  alert( a + b ); // work er en tilfældig funktion eller metode
}

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. Denne decorator kan være brugbar ved unit-testing. En avanceret form er sinon.spy i Sinon.JS biblioteket.

Åbn en sandbox med tests.

Wrapperen der returneres af spy(f) skal gemme alle argumenter og derefter bruge f.apply til at videregive kaldet.

function spy(func) {

  function wrapper(...args) {
    // bruger ...args i stedet for arguments for at gemme et "rigtigt" array i wrapper.calls
    wrapper.calls.push(args);
    return func.apply(this, args);
  }

  wrapper.calls = [];

  return wrapper;
}

Åbn løsningen med tests i en sandbox.