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

lh80um4z  于 5个月前  发布在  Jest
关注(0)|答案(1)|浏览(85)

我有一个基本的express服务器,我用Jest和Supertest测试。我试图模拟一个由控制器导入的ES模块。测试工作正常,但我不能使模拟工作。这里有一些片段,你也可以通过下面的链接看到项目设置和配置。
minimal reproduction repo

// 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}`});
}

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

uqzxnwby

uqzxnwby1#

  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.

相关问题