В unit-тестировании Stub
(англ. “заглушка”) - это объект, который заменяет реальный объект, но не имитирует его полностью, а предоставляет только минимальный набор функций, необходимых для тестирования. Stub
обычно используется, когда необходимо создать объект, который зависит от других компонентов, но эти компоненты еще не готовы или не доступны на момент тестирования.
Stub
может предоставлять фиктивные данные для тестирования, а также имитировать поведение реального объекта. Однако он не предоставляет полную функциональность реального объекта, а только те методы, которые необходимы для тестирования.
Stub
может быть реализован как самостоятельный класс или как часть другого класса. Он может быть создан вручную или с помощью специальных инструментов.
Использование Stub в unit-тестировании позволяет изолировать тестируемый объект от внешних зависимостей и контролировать его поведение в тестовых условиях. Это позволяет улучшить качество и надежность программного обеспечения, а также ускорить процесс тестирования.
Пример
Представим, что у нас есть функциональный компонент OrderProcessor
, который зависит от сервиса PaymentService
для обработки платежей. Сервис PaymentService
имеет метод processPayment
, который принимает на вход сумму платежа и возвращает результат обработки платежа. Для тестирования этого компонента нам нужно изолировать его от зависимости от PaymentService
.
Мы можем создать Stub объект PaymentServiceStub
, который будет имитировать работу реального объекта, но будет возвращать фиктивный результат.
const PaymentServiceStub = {
processPayment: (amount) => true,
};
Затем мы можем создать функциональный компонент OrderProcessor
, который будет использовать этот Stub сервис.
import React, { useState } from 'react';
const OrderProcessor = ({ amount, paymentService }) => {
const [paymentResult, setPaymentResult] = useState(null);
const handleProcessOrder = async () => {
const result = await paymentService.processPayment(amount);
setPaymentResult(result);
};
return (
<div>
<button onClick={handleProcessOrder}>Process Order</button>
{paymentResult !== null && <div>Payment Result: {paymentResult ? 'Success' : 'Failure'}</div>}
</div>
);
};
Теперь мы можем протестировать компонент OrderProcessor
с использованием Stub сервиса PaymentServiceStub
.
import { render, screen, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom/extend-expect';
test('processes order and shows success message', () => {
render(<OrderProcessor amount={100} paymentService={PaymentServiceStub} />);
const processButton = screen.getByText(/Process Order/i);
fireEvent.click(processButton);
const paymentResultElement = screen.getByText(/Payment Result: Success/i);
expect(paymentResultElement).toBeInTheDocument();
});
Таким образом, использование Stub объекта позволяет нам изолировать тестируемый компонент от внешних зависимостей и контролировать его поведение в тестовых условиях.