我正在尝试为我的 REST 端点之一运行简单的单元测试。
但是,我无法成功模拟
TopicEntity.findAll
函数。
具有以下内容:
import request from 'supertest';
import { app } from '../../main.js';
import { jest } from '@jest/globals';
import { TopicEntity } from '../../db/entity/TopicEntity.js';
jest.mock('../../db/entity/TopicEntity.js');
describe('TopicController', () => {
describe('GET /topics', () => {
it('should return a list of topics', async () => {
// Given
const mockTopics = [
{ id: 1, name: 'JavaScript' },
{ id: 2, name: 'TypeScript' },
];
(TopicEntity.findAll as jest.Mock).mockResolvedValue(mockTopics as never);
// when
const response = await request(app).get('/api/topics');
// then
expect(response.status).toBe(200);
expect(response.body).toEqual(mockTopics);
});
});
});
我收到了
TopicEntity.findAll.mockResolvedValue is not a function
TypeError: TopicEntity.findAll.mockResolvedValue is not a function
我还尝试使用模块工厂来模拟对象:
jest.mock('../../db/entity/TopicEntity.js', () => {
return {
TopicEntity: {
findAll: jest.fn(),
},
};
});
但我得到了相同的结果。
如何成功模拟这个函数?
事实证明,静态方法必须像下面这样进行模拟:
describe(TopicController.name, () => {
describe('GET /topics', () => {
it('should return a list of topics', async () => {
// given
const mockTopics: Topic[] = [
{ id: 1, name: 'JavaScript' },
{ id: 2, name: 'TypeScript' },
];
TopicEntity.findAll = jest.fn<() => Promise<Topic[]>>().mockResolvedValue(mockTopics) as any;
// when
const response = await request(app).get('/api/topics');
// then
expect(response.status).toBe(200);
expect(response.body).toEqual(mockTopics);
});
});
});