Visitar URL original
دکوراتور جاسوس

ما قصد داریم این پروژهٔ متن‌باز را در دسترس همهٔ مردم در سرتاسر دنیا قرار دهیم.

به ترجمهٔ محتوای این آموزش به زبان خودتان کمک کنید/a>.

بازگشت به درس

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

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