بازگشت به درس

دکوراتور جاسوس

اهمیت: 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 است.

باز کردن یک sandbox همراه با تست‌ها.

دربرگیرنده که توسط 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;
}

باز کردن راه‌حل همراه با تست‌ها درون یک sandbox.