Предположим, у вас есть приложение с сервисной и контроллерной слоями. Контроллер использует сервисы для выполнения операций. В этом сценарии вы можете использовать метод .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()для восстановления оригинальной реализации метода после теста.
Этот подход позволяет изолировать поведение отдельных компонентов, гарантируя, что они взаимодействуют как ожидается, без необходимости знать внутреннюю работу каждого компонента.