🔎 Юнит тест — это тест, который проверяет правильность работы небольшого фрагмента кода (юнита).
🚩Особенности юнит тестов
1️⃣. Проверка небольших фрагментов кода.
2️⃣. Быстрая проверка.
3️⃣. Изоляция от остального кода.
🔍 Способы изоляции кода в юнит тестах
Тесты можно разделить на две школы по способу изоляции кода:
🔵Детройтская школа (классический подход)
🔵Лондонская школа
📘 Классический подход:
☑️Юнит тесты проверяют код с минимальной изоляцией.
☑️Интеграция с реальными зависимостями.
🎓 Лондонская школа:
☑️Сильная изоляция кода.
☑️Использование заглушек и моков для имитации зависимостей.
⚖️ Разница в подходах
🔵 Классический подход: Реальные зависимости, меньше моков.
🔵 Лондонская школа: Полная изоляция, много моков и заглушек.
💻 Примеры кода
Тестируемый код
// orderService.js
class OrderService {
constructor(paymentService) {
this.paymentService = paymentService;
}
placeOrder(order) {
if (this.paymentService.processPayment(order)) {
return 'Order placed';
} else {
return 'Payment failed';
}
}
}
// paymentService.js
class PaymentService {
processPayment(order) {
// Логика обработки платежа
return true; // Или false в случае ошибки
}
}
Классический подход 📘
test('placeOrder returns "Order placed" when payment is successful', () => {
const paymentService = new PaymentService();
const orderService = new OrderService(paymentService);
const order = { amount: 100 };
const result = orderService.placeOrder(order);
expect(result).toBe('Order placed');
});Лондонская школа🎓
test('placeOrder returns "Order placed" when payment is successful', () => {
const paymentService = { processPayment: jest.fn().mockReturnValue(true) };
const orderService = new OrderService(paymentService);
const order = { amount: 100 };
const result = orderService.placeOrder(order);
expect(result).toBe('Order placed');
expect(paymentService.processPayment).toHaveBeenCalledWith(order);
});💡Вывод:
Выбор подхода зависит от конкретного проекта и предпочтений команды.
Теги: #unitTests #testing #cleanСode