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