我有一个基本的Express服务器,我用Jest和Supertest进行了测试.我正在try 模拟由控制器导入的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}`});
}
// 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()"使其工作,但我甚至不确定它是否适用于这种情况,因为我没有在测试文件中直接使用导入的模块.

推荐答案

  1. module_to_mock.js模块使用默认导出,因此您需要模拟如下函数:
jest.unstable_mockModule('./module_to_mock.js', () => {
  return {
    default: jest.fn().mockReturnValue(true),
  };
});
  1. Module mocking in ESM文档中,您需要使用Dynamic 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.

Node.js相关问答推荐

使用prisma迁移到SQL失败

如果非SQL函数在事务内部运行失败,PG-Promise事务会回滚吗?

Mongoose:如何在文档中推送到Caped(有限大小,滚动窗口)数组?

Redis Typescript 删除方法类型转换

几个 lambda 共有的函数

NPM如何管理node_modules传递依赖?

Postgressql的BIGSERIAL自增序列,即使由于唯一约束错误没有创建行,也会自动增加

如何获取文件的中间值?

Mongoose post中间件触发deleteMany

如何在 Docker 容器中 SSO 登录 AWS(使用 aws-sdk v3)

为什么 FastAPI 需要 Web 服务器(即 Nginx)而不是 Express API?

JAVASCRIPT:foreach 循环后的空数组

带权限的机密 Rest-Api - 总是 403 - 我做错了什么?

如何在 MongoDB collection.find() 上获取回调

Mongoose:查找、修改、保存

编写可维护的事件驱动代码

为什么数组上的js映射会修改原始数组?

Node应用程序中相同npm包的两个版本

如何使用 cookie 创建 HTTP 客户端请求?

yarn 和 npm 的主要区别是什么?