Jest-тест не пройден для асинхронной функции, которая вызывает другую асинхронную функцию - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь проверить асинхронную функцию, которая использует данные, возвращенные другой асинхронной функцией. Вот код, объясняющий мою проблему:

StudentInfo.js

export async function getData() {
  //studentData imported from another file
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(studentData);
    }, 5000);
  });
}

export async function filterStudents() {
  const studentData = await StudentInfo.getData();

  //computations

  return filteredData; //object
}

StudentInfo.test.js

import * as studentInfo from "src/StudentInfo.js"

describe("StudentInfo" , () => {
   test("student data correctly filtered", async () => {
      const studentData = [
         {
            name: Sarah Marshall,
            id: srhmar451
         },
         {...}
      ];
      expectedData = { [...], [...]};
      const spy = jest.spyOn(studentInfo, "getData");
      spy.mockReturnValue(studentData);
      await expect(studentInfo.filterStudents()).toEqual(expectedData);
   });
});

Мой тест не пройден, так как ожидаемое возвращаемое значение - Promise {}. Может ли кто-нибудь помочь мне написать тест для моей функции filterStudents()? Я застрял в этом слишком долго.

1 Ответ

0 голосов
/ 27 июня 2019

Вот рабочий пример для начала:

StudentInfo.js

import * as StudentInfo from './StudentInfo';

export async function getData() {
  throw new Error('should not get here');  // <= getData will be mocked
}

export async function filterStudents() {
  const studentData = await StudentInfo.getData();
  return studentData.filter(v => v.id === '2');
}

StudentInfo.test.js

import * as StudentInfo from "./StudentInfo"

describe("StudentInfo", () => {
  test("student data correctly filtered", async () => {
    const studentData = [
      { name: 'student1', id: '1' },
      { name: 'student2', id: '2' },
      { name: 'student3', id: '3' }
    ];
    jest.spyOn(StudentInfo, "getData").mockResolvedValue(studentData);
    await expect(StudentInfo.filterStudents()).resolves.toEqual([{ name: 'student2', id: '2' }]);  // Success!
  });
});

Вы можете использовать mockFn.mockResolvedValue, чтобы смоделировать возвращаемое значение как Promise, которое преобразуется в значение, которое вы передаете ему (хотя это также работает нормально, если вы просто используете mockFn.mockReturnValue, так как оно действительно длявызовите await для значения, например const five = await 5; // <= works fine).

Важной частью является использование .resolves, чтобы сообщить Jest, что ожидаемое значение равно Promiseчто вы ожидаете разрешить, а затем соедините toEqual для подтверждения ожидаемого разрешенного значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...