レッスンに戻る

スパイデコレーター

重要度:5

spy(func)という、関数のすべての呼び出しをそのcallsプロパティに保存するラッパーを返すデコレーターを作成してください。

各呼び出しは、引数の配列として保存されます。

例:

function work(a, b) {
  alert( a + b ); // work is an arbitrary function or method
}

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. そのデコレーターは単体テストで有用な場合があります。洗練された形は、Sinon.JSライブラリのsinon.spyです。

テスト付きのサンドボックスを開く。

spy(f)が返すラッパーは、すべての引数を格納してからf.applyを使用して呼び出しを転送する必要があります。

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

テスト付きの解決策をサンドボックスで開く。