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