以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
38. 实现`jest.spyOn()`

实现思路可以分成几个步骤:

  1. 储存原来的 method
  2. 重写 method, 让它调用原 method, 然后在内部执行 spy。
  3. 返回 spy 对象,包含 calls 属性,以便之后验证。

代码实现如下:

function spyOn(obj, methodName) {
  const originalFn = obj[methodName] // 1. 储存原 method
  const calls = [] // 存储每一次调用时的参数

  // 重写 method
  obj[methodName] = function(...args) {
    calls.push(args) // 存储一次调用所带的参数
    return originalFn.apply(this, args) // 执行原来的 method,并返回其返回值
  }

  // 返回 spy 对象
  return {
    calls,
    // 如果你想要 mock 掉原来的 method, 可以用 restore 方法
    restore() {
      obj[methodName] = originalFn
    }
  }
}

在测试中应该这样使用:

const obj = {
  data: 1, 
  increment(num) {
    this.data += num
  }
}

const spy = spyOn(obj, 'increment')

obj.increment(1)

console.log(obj.data) // 2

obj.increment(2)

console.log(obj.data) // 4

console.log(spy.calls)
// [ [1], [2] ]

结果会和题目中的代码一样。