在React中,如何在单元测试中实例化没有构造函数的类?

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

我正在使用React 16.13.0。我有以下课程(Missions.ts)...

class Missions {

  repo() : MissionRepository {
    return getRepository(Mission) as MissionRepository;
  }

  async getAll() : Promise<Mission[]>  {
    return this.repo().find();
  }
    ...
  async removeVolunteerFromMission(missionId: string) {
    const missions = this.repo();
    const mission = await missions.findById(missionId);
    mission.volunteerId = '';
    mission.status = MissionStatus.unassigned;
    return missions.update(mission);
  }
  ...
}

export default new Missions();

我正在尝试为方法编写一些单元测试,但在弄清楚如何实例化我的类时遇到了麻烦。我已经尝试了以下...

import React from "react";
import { CustomRepository, getRepository } from 'fireorm';
import { BaseRepository } from './BaseRepository'
import { Mission } from './schema';
import { Missions } from './Missions';

describe('Missions', () => {
  describe('#removeVolunteerFromMission', () => {
    const missionId = "1234";
    const mission = new Mission();

    beforeEach(() => {
      const mockFindById = jest.fn();
      BaseRepository.prototype.findById = mockFindById;
      mockFindById.mockReturnValue(Promise.resolve(mission));

      const mockUpdate = jest.fn();
      BaseRepository.prototype.update = mockUpdate;
      mockUpdate.mockReturnValue(Promise.resolve(mission));
    });

    it('unassigns volunteer', () => {
      const obj = new Missions();
      obj.removeVolunteerFromMission(missionId)
      expect(mockFindById).toHaveBeenCalledTimes(1);
      expect(mockUpdate).toHaveBeenCalledTimes(1);
      expect(mission.volunteer).toBe(null);
    });
  });
});

但是使用“ hpm测试”运行测试时,出现此错误

TypeError: _Missions.Missions is not a constructor

在线

const obj = new Missions()

如何在测试中实例化我的课程?

reactjs typescript unit-testing constructor instantiation
1个回答
0
投票

问题是您正在导出Missions类的实例,而不是类本身,并且您无法再次实例化实例。因此,仅导出类,然后在要使用它的地方实例化它。

export default Missions;

在您想使用的地方实例化:

const missions = new Missions();

也导入了默认的导出而没有大括号,所以这样做:

import Missions from './Missions';
© www.soinside.com 2019 - 2024. All rights reserved.