使用React和Jest,我该如何模拟需要等待的Promise?

时间:2020-04-15 22:32:38

标签: reactjs promise mocking jestjs

我正在使用React 16.13.0并尝试使用笑话来测试是否调用了一个方法。我对如何使用模拟感到非常困惑。我有这种方法...

class Missions {
    ...
  async removeVolunteerFromMission(missionId: string) {
    const missions = this.repo();
    const mission = await missions.findById(missionId);
    mission.volunteerId = '';
    mission.status = MissionStatus.unassigned;
    return this.repo().update(mission);
  }
...
export default new Missions();

如何测试我的“ findById”方法是否被调用?我有这种测试方法...

it('unassigns volunteer', async() => {

  const missionId = "1234";
  const mission = new Mission();
  mission.missionId = missionId;

  const mockFindById = jest.fn().mockResolvedValue(mission);
  const mockUpdate = jest.fn().mockResolvedValue(mission);
  const baseRepo = {
    findById: () => mockFindById,
    update: () => mockUpdate
  };
  jest.spyOn(missions, 'repo').mockReturnValue(baseRepo);

  await missions.removeVolunteerFromMission(missionId);

  console.log("mission === " + mission);

  expect(mockFindById).toHaveBeenCalledTimes(1);
});

但这失败

expect(jest.fn()).toHaveBeenCalledTimes(expected)

Expected number of calls: 1
Received number of calls: 0

  29 |       console.log("mission === " + mission);
  30 | 
> 31 |       expect(mockFindById).toHaveBeenCalledTimes(1)
     |                            ^

我真的如何称呼它为真的?

1 个答案:

答案 0 :(得分:0)

这里实际上并没有调用间谍/模拟,匿名函数是

const baseRepo = {
  findById: () => mockFindById,
  update: () => mockUpdate
};

但只需设置模拟功能即可

const baseRepo = {
  findById: mockFindById,
  update: mockUpdate
};