レッスンに戻る

Spy デコレータ

重要性: 5

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

すべての呼び出しは引数の配列として格納されます。

For instance:

function work(a, b) {
  alert( a + b ); // work は任意の関数またはメソッド
}

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 です。

テストと一緒にサンドボックスを開く

ここでは、ログにすべての引数を格納するために calls.push(args) を使い、呼び出しをフォワードするために、f.apply(this, args) を使う事ができます。

function spy(func) {

  function wrapper(...args) {
    wrapper.calls.push(args);
    return func.apply(this, arguments);
  }

  wrapper.calls = [];

  return wrapper;
}

サンドボックスでテストと一緒に解答を開く