Как установить возвращаемое значение функции в пределах издевательской зависимости в шутку?

#typescript #unit-testing #jestjs #mocking

#typescript #модульное тестирование #jestjs #издевательство

Вопрос:

Я пытаюсь издеваться над моделью mongoose, чтобы я мог модульно протестировать экспресс-контроллер. Я удалил весь нерелевантный код, чтобы показать, что я пытаюсь сделать. Вот код, который нужно протестировать:

 import User from "../../models/User";

const getAllUsers = async () => {
  const users = await User.find(); // I want to mock the return value of User.find()
  return users;
};

export { getAllUsers };

 

И вот тестовый файл:

 import { getAllUsers } from "./discord";
import User from "../../models/User";

jest.mock("../../models/User", () => ({
  find: jest.fn(),
}));

describe("getAllUsers", () => {
  test("makes read request to database", async () => {
    User.find.mockResolvedValueOnce("some result"); // Causes error. How can I mock User.find?
    const result = await getAllUsers();
    expect(User.find).toHaveBeenCalledTimes(1);
    expect(result).toBe("some result");
  });
});
 

В тестовом файле User.find не распознается как макет. Я получаю следующий сбой теста:

  FAIL  src/controllers/users/discord.test.tsTest suite failed to run

    src/controllers/users/discord.test.ts:10:15 - error TS2339: Property 'mockResolvedValueOnce' does not exist on type '{ (callback?: Callback<(Document<any, any, UserInterface> amp; UserInterface amp; { _id: ObjectId; })[]> | undefined): Query<...>; (filter: FilterQuery<...>, callback?: Callback<...> | undefined): Query<...>; (filter: FilterQuery<...>, projection?: any, options?: QueryOptions | ... 1 more ... | undefined, callback?: Callb...'.

    10     User.find.mockResolvedValueOnce("some result");
                     ~~~~~~~~~~~~~~~~~~~~~

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.193 s
 

Как я могу издеваться над пользовательским find методом?

Пожалуйста, обратите внимание, что я хочу изменить издевательское возвращаемое значение User.find() в каждом отдельном тесте, который я пишу. Я также хочу издеваться над другими методами пользователя, такими как findById() , но я сосредоточился только на методе find() с целью написания этого поста.

РЕДАКТИРОВАТЬ: я создал эту изолированную среду, чтобы кому-то было легче мне помочь.

Ответ №1:

Я думаю, вам следует использовать что-то вроде этого:

const resultReport = repositoryPort.findById = jest.fn(() => of(mockLoan));

mockLoan — это макет, который вы хотите вернуть.