jestjs - 开 Jest : how to mock a function which is used by another function of the same module

标签 jestjs

我正在尝试测试一个依赖于同一模块中另一个函数的函数。我想模拟第二个,我尝试过的方法如下:

utils.js:

const buildEngine = () => 'Engine';

const buildCar = () => {
  const engine = buildEngine();
  return engine + ' and ' + 'Car Body';
};

module.exports = {
  buildEngine,
  buildCar
};

utils.spec.js:

function mockModule() {
  const original = require.requireActual('./utils');
  return { ...original, buildEngine: jest.fn(() => 'Mock Engine') };
}

it('Builds a Car', () => {
  jest.mock('./utils', () => mockModule());

  const utils = require.requireMock('./utils');

  expect(utils.buildEngine()).toBe('Mock Engine');
  expect(utils.buildCar()).toBe('Mock Engine and Car Body');
});

发生的情况是,即使我能够模拟“buildEngine”函数,当我测试“buildCar”函数时,它仍然引用未模拟的“buildEngine”。 请帮忙。

最佳答案

解决方案如下:

utils.js:

const buildEngine = () => 'Engine';

const buildCar = () => {
  const engine = exports.buildEngine();
  return engine + ' and ' + 'Car Body';
};

exports.buildEngine = buildEngine;
exports.buildCar = buildCar;

utils.spec.js:

const utils = require('./utils');

describe('utils', () => {
  it('Builds a Car', () => {
    const buildEngineSpy = jest.spyOn(utils, 'buildEngine').mockReturnValue('Mock Engine');
    expect(utils.buildCar()).toBe('Mock Engine and Car Body');
    expect(buildEngineSpy).toBeCalledTimes(1);
    buildEngineSpy.mockRestore();
  });

  it('build engine original implementation', () => {
    expect(utils.buildEngine()).toBe('Engine');
    expect(utils.buildCar()).toBe('Engine and Car Body');
  });
});

单元测试结果:

 PASS  src/stackoverflow/46437290/utils.spec.js
  utils
    ✓ Builds a Car (4ms)
    ✓ build engine original implementation (1ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.908s, estimated 2s

这是已完成的演示:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/46437290

关于jestjs - 开 Jest : how to mock a function which is used by another function of the same module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46437290/

相关文章:

reactjs - 开 Jest : Test useNavigate hook in function component

jestjs - 开 Jest 不在多项目模式下选择配置

javascript - 使用 MobX 存储循环引用进行设置测试

javascript - 用 Jest 测试 html 页面

vue.js - 如何使用 vitest 和 vue test utils 测试 Vue 2 css 类样式

javascript - Next.js Jest 28 - 无法转换 SVG 文件

javascript - 类型 'toMatchSnapshot' 上不存在属性 'Assertion'

reactjs - 如何用 Jest 和 enzyme 来使用 Relay Modern 进行测试?

reactjs - 尝试在 ReactJs 中测试组件时出现这些错误

reactjs - 对于连接的组件, enzyme wrapper.instance()为空