#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.ts
● Test 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 — это макет, который вы хотите вернуть.