mockResolvedValue 不是函数:我们如何使用 jest 对 TSOA 休息端点进行单元测试?

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

我正在尝试为我的 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(),
    },
  };
});

但我得到了相同的结果。

如何成功模拟这个函数?

express unit-testing jestjs tsoa
1个回答
0
投票

事实证明,静态方法必须像下面这样进行模拟:

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);
    });
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.