Этот вопрос проверяет понимание разницы между проверкой факта вызова метода и проверкой точного количества его вызовов, что важно для тестирования побочных эффектов и корректности логики.
В модульном тестировании часто используется мокирование (mock) или шпионаж (spy) для проверки взаимодействия с внешними зависимостями. Проверка, что метод был вызван, подтверждает, что определённый путь кода был выполнен. Однако этого недостаточно для полноценной проверки корректности логики.
Рассмотрим типичный сценарий: метод, который отправляет email пользователю. Если мы проверяем только факт вызова, тест пройдёт, даже если метод был вызван дважды (что приведёт к дублированию писем) или не был вызван вовсе из-за ошибки в условии. Проверка точного количества вызовов (например, ровно один раз) гарантирует, что побочный эффект произошёл ожидаемое число раз.
Допустим, у нас есть сервис уведомлений, который должен отправлять приветственное письмо новому пользователю, но только если пользователь активировал эту опцию.
class UserService {
constructor(notifier) {
this.notifier = notifier;
}
registerUser(user, sendWelcomeEmail) {
// Регистрация пользователя в системе...
if (sendWelcomeEmail) {
this.notifier.sendWelcomeEmail(user.email);
}
}
}
// Тест с использованием Jest и моков
it('should send welcome email exactly once when flag is true', () => {
const mockNotifier = {
sendWelcomeEmail: jest.fn()
};
const service = new UserService(mockNotifier);
const testUser = { email: 'test@example.com' };
service.registerUser(testUser, true);
// Проверка только факта вызова:
// expect(mockNotifier.sendWelcomeEmail).toHaveBeenCalled();
// Этого недостаточно!
// Правильная проверка количества вызовов:
expect(mockNotifier.sendWelcomeEmail).toHaveBeenCalledTimes(1);
expect(mockNotifier.sendWelcomeEmail).toHaveBeenCalledWith('test@example.com');
});
it('should not send email when flag is false', () => {
const mockNotifier = {
sendWelcomeEmail: jest.fn()
};
const service = new UserService(mockNotifier);
const testUser = { email: 'test@example.com' };
service.registerUser(testUser, false);
// Проверка, что метод не вызывался ни разу:
expect(mockNotifier.sendWelcomeEmail).toHaveBeenCalledTimes(0);
});Такая практика широко используется в модульном и интеграционном тестировании, особенно при работе с:
Вывод: Проверка количества вызовов метода — это важная практика для написания надёжных тестов. Она позволяет убедиться не только в том, что код был выполнен, но и в том, что он выполнился корректное количество раз, предотвращая ошибки логики и неэффективное использование ресурсов. Особенно критична эта проверка для методов с побочными эффектами (отправка данных, изменение состояния).