除非事先定义,否则嵌套的Jest模拟会失败

时间:2019-08-15 10:09:01

标签: javascript unit-testing mocking jestjs

jest.fn()模拟的回调中使用jest.fn()定义Jest模拟似乎不起作用。如果在回调之外首先定义了模拟,则它将正常工作。

是否支持在回调中定义模拟?

it('passes', () => {
  const mock = jest.fn();
  const object = {method1: jest.fn(() => ({method2: mock}))};

  object.method1().method2();

  expect(object.method1().method2).toHaveBeenCalledTimes(1);
});

it('does not pass', () => {
  const object = {method1: jest.fn(() => ({method2: jest.fn()}))};

  object.method1().method2();

  expect(object.method1().method2).toHaveBeenCalledTimes(1);
});

1 个答案:

答案 0 :(得分:1)

第二个示例未通过的原因是由于每次调用object.method1()时,您都会在method2属性中返回一个新的间谍。

因此,当您执行object.method1().method2();时,您将创建一个模拟函数并通过对method2的调用来执行它。该模拟功能确实正在执行。

当您在期望语句中调用object.method1().method2时,您将在method2中获得一个新创建的模拟函数。尚未调用此模拟函数,因此测试失败。