我有一个基本的 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()”来使其工作,但我什至不确定它是否适用于这种情况,因为我没有在测试中直接使用导入的模块文件。
module_to_mock.js
模块使用默认导出,因此您需要模拟该函数,例如:jest.unstable_mockModule('./module_to_mock.js', () => {
return {
default: jest.fn().mockReturnValue(true),
};
});
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.