Предположим, у вас есть приложение с сервисной и контроллерной слоями. Контроллер использует сервисы для выполнения операций. В этом сценарии вы можете использовать метод .spyOn() для мониторинга взаимодействий между этими слоями во время тестирования.
Пример:
У вас есть сервис UserService с функцией deleteUser, которая вызывается контроллером UserController в функции removeUser. Вы хотите убедиться, что функция removeUser действительно вызывает deleteUser.
// userService.js
export const UserService = {
deleteUser: (userId) => {
// Логика удаления пользователя
console.log(`User ${userId} deleted`);
},
};
// userController.js
import { UserService } from "./userService";
export const UserController = {
removeUser: (userId) => {
UserService.deleteUser(userId);
},
};Тест с использованием .spyOn():
// userController.test.js
import { UserController } from "./userController";
import { UserService } from "./userService";
test("UserController calls UserService.deleteUser", () => {
// Создаем spy на метод deleteUser
const deleteUserSpy = jest.spyOn(UserService, "deleteUser");
// Вызываем метод контроллера
UserController.removeUser(1);
// Проверяем, что метод deleteUser был вызван
expect(deleteUserSpy).toHaveBeenCalledWith(1);
// Опционально: проверяем, что метод был вызван один раз
expect(deleteUserSpy).toHaveBeenCalledTimes(1);
// Восстанавливаем оригинальную реализацию метода
deleteUserSpy.mockRestore();
});Пояснение:
- Создание spy: Используем
jest.spyOn(UserService, 'deleteUser')для создания spy на методеdeleteUser. - Вызов метода контроллера: Вызываем
UserController.removeUser(1), что должно привести к вызовуUserService.deleteUser(1). - Проверка вызова: Используем
expect(deleteUserSpy).toHaveBeenCalledWith(1)для проверки, чтоdeleteUserбыл вызван с правильным аргументом. - Проверка количества вызовов: Опционально проверяем, что метод был вызван один раз с помощью
expect(deleteUserSpy).toHaveBeenCalledTimes(1). - Восстановление оригинальной реализации: Используем
deleteUserSpy.mockRestore()для восстановления оригинальной реализации метода после теста.
Этот подход позволяет изолировать поведение отдельных компонентов, гарантируя, что они взаимодействуют как ожидается, без необходимости знать внутреннюю работу каждого компонента.