دکوراتور جاسوس
اهمیت: 5
یک دکوراتور spy(func)
بسازید که باید دربرگیرندهای را برگرداند که تمام فراخوانیهای تابع را درون ویژگی calls
خودش ذخیره کند.
هر فراخوانی به عنوان آرایهای از آرگومانها ذخیره میشود.
برای مثال:
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"
}
پینوشت: این دکوراتور بعضی اوقات در انجام یونیت تست (unit-testing) کاربرد دارد. شکل پیشرفته آن sinon.spy
در کتابخانه Sinon.JS است.
دربرگیرنده که توسط spy(f)
برگردانده میشود باید تمام آرگومانها را ذخیره و سپس از f.apply
برای ارسال کردن فراخوانی استفاده کند.
function spy(func) {
function wrapper(...args) {
// wrapper.calls برای ذخیره کردن آرایه «واقعی» درون arguments به جای ...args استفاده از
wrapper.calls.push(args);
return func.apply(this, args);
}
wrapper.calls = [];
return wrapper;
}