Jest 模拟由 http 服务器控制器导入的 ES 模块

问题描述 投票:0回答:1

我有一个基本的 Express 服务器,我用 Jest 和 Supertest 进行测试。我正在尝试模拟由控制器导入的 ES 模块。测试工作正常,但我无法使模拟工作。这里是一些片段,您还可以通过下面的链接查看项目设置和配置。

最小复制仓库

// message_controller.js
import moduleToMock from './module_to_mock.js';

export default async (req, res) => {
  const { message } = req.body;

  const mockWorks = moduleToMock(); // Returns false by default, must be mocked to return true
  if (!mockWorks) {
    return res.status(400).json({message: 'Mock did not work'});
  }

  return res.status(200).json({message: `Mock works: ${message}`});
}
// message_controller.test.js
jest.unstable_mockModule('./module_to_mock.js', () => 
  jest.fn().mockReturnValue(true) 
);

test('Mock successfully', async () => {
  const messageToSend = 'hello';
  const response = await server.post('/message').send(
    {message: messageToSend}
  );

  expect(response.body.message).toEqual(`Mock works: ${messageToSend}`);
});

我已经看到了问题10025,人们使用“await import()”来使其工作,但我什至不确定它是否适用于这种情况,因为我没有在测试中直接使用导入的模块文件。

node.js express jestjs mocking es6-modules
1个回答
0
投票
  1. module_to_mock.js
    模块使用默认导出,因此您需要模拟该函数,例如:
jest.unstable_mockModule('./module_to_mock.js', () => {
  return {
    default: jest.fn().mockReturnValue(true),
  };
});
  1. 根据ESM文档中的模块模拟,您需要使用动态
    import()
    在测试中导入
    app.js
    模块。

最终代码:

import request from 'supertest';
import { jest } from '@jest/globals';

jest.unstable_mockModule('./module_to_mock.js', () => {
  return {
    default: jest.fn().mockReturnValue(true),
  };
});

test('Mock successfully', async () => {
  const app = (await import('./app')).default;
  const server = request(app());
  const messageToSend = 'hello';
  const response = await server.post('/message').send({ message: messageToSend });

  expect(response.body.message).toEqual(`Mock works: ${messageToSend}`);
});

测试结果:

(node:9201) ExperimentalWarning: VM Modules is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
 PASS  ./message_controller.test.js
  ✓ Mock successfully (73 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.35 s, estimated 1 s
Ran all test suites.

Watch Usage: Press w to show more.
© www.soinside.com 2019 - 2024. All rights reserved.