jest.spyOn无法使用重构功能

为什么jest.spyOn不能与在测试外进行重构的重构功能一起使用?

以下测试将失败:

export const Funcs = {
  foo: () => {
    return 'foo';
  }
};

const { foo } = Funcs;

test('should pass',() => {
  const spy = jest.spyOn(Funcs,'foo');
  foo();
  expect(spy).toHaveBeenCalled();
});

但是,如果我们在测试中移动解构结构,它将起作用:

test('should pass','foo');
  const { foo } = Funcs;
  foo();
  expect(spy).toHaveBeenCalled();
});
hailang_163 回答:jest.spyOn无法使用重构功能

调用jest.spyOn(Funcs,'foo');时,Funcs对象将被修改为具有新的foo属性。您的第一个代码示例是在模拟它之前访问Funcs.foo的过程,因此const foo指的是实函数。第二个代码示例是在进行模拟后访问Funcs.foo,因此您要指向模拟函数。

如果您不使用开玩笑和进行破坏操作,那么这是您正在做的事情的例证。修改前访问:

const example = {
  value: 1
}
const val = example.value;
example.value = 2;
console.log(val);

在访问之前进行修改:

const example = {
  value: 1
}
example.value = 2;
const val = example.value;
console.log(val);

,

我遇到了类似的问题 - 我正在为我的 Express.js 控制器编写测试,这些控制器使用了一些辅助函数,这些函数都是使用解构和 index.js 文件导入的。在尝试编写这些测试时,我无法拦截原始函数来模拟它们。我最初决定为这些辅助函数使用默认导入,这样我就可以轻松地jest.spyOn 使用它们,但从视觉上看,我更喜欢解构导入。

然而,我今天在玩它,在导入我的控制器文件之前,我通过设置我的所有 spies 让它与解构一起工作。通过这种方式,我在将原始函数导入控制器文件之前成功拦截并模拟了它。所以这是有效的:

  const utilities = require("../utilities");
  const axiosInstanceSpy = jest.spyOn(utilities,"pchAxiosInstance");
  const createPCHObjectSpy = jest.spyOn(utilities,"createPCHObject");
  const pchController = require("./pchController");

但这不会:

  const utilities = require("../utilities");
  const pchController = require("./pchController");
  const axiosInstanceSpy = jest.spyOn(utilities,"createPCHObject");
本文链接:https://www.f2er.com/3137260.html

大家都在问