返回课程

间谍装饰器

重要性:5

创建一个装饰器 spy(func),它应该返回一个包装器,该包装器将对函数的所有调用保存在其 calls 属性中。

每个调用都保存为一个参数数组。

例如

function work(a, b) {
  alert( a + b ); // work is an arbitrary function or method
}

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

附注:该装饰器有时对单元测试很有用。它的高级形式是 Sinon.JS 库中的 sinon.spy

打开一个带有测试的沙箱。

spy(f) 返回的包装器应存储所有参数,然后使用 f.apply 转发调用。

function spy(func) {

  function wrapper(...args) {
    // using ...args instead of arguments to store "real" array in wrapper.calls
    wrapper.calls.push(args);
    return func.apply(this, args);
  }

  wrapper.calls = [];

  return wrapper;
}

在沙盒中打开包含测试的解决方案。