Назад к вопросам
Middle
161
questionbank

Что такое мок и стабы? Чем они отличаются?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Моки и стабы — это типы тестовых дублеров, которые используются при модульном тестировании для имитации поведения реальных зависимостей объекта.

Стаб (Stub):

  • Предоставляет "заст
<?php
// Пример стабового объекта
class StubDatabase {
    public function getUserById(int $id): ?array {
        // Имитация возвращаемого значения для конкретного ID
        if ($id === 1) {
            return ['id' => 1, 'name' => 'Test User'];
        }
        return null;
    }
}

роено" поведение для тестового сценария.

  • Отвечает на вызовы методов, возвращая заранее заданные значения.
  • Не имеет логики проверки взаимодействия. Его цель — обеспечить тестовому объекту данные для продолжения работы.

Мок (Mock):

  • Подобен стабу, но с добавленной логикой проверки взаимодействия.
  • Содержит ожидания относительно того, какие методы должны быть вызваны, сколько раз и с какими аргументами.
  • Тест проверяет не только результат работы тестируемого объекта, но и корректность его взаимодействия с моком.
<?php
// Пример мок-объекта
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\MockObject\MockObject;

class UserServiceTest extends TestCase {
    public function testGetUserByIdCallsDatabase(): void {
        $databaseMock = $this->createMock(Database::class);
        $databaseMock->expects($this->once()) // Ожидаем один вызов метода
                     ->method('getUserById')
                     ->with(1) // Ожидаем аргумент 1
                     ->willReturn(['id' => 1, 'name' => 'Test User']); // Ожидаем возвращаемое значение

        $userService = new UserService($databaseMock);
        $user = $userService->getUserById(1);

        // Проверка результата работы, но также и проверка взаимодействия через мок
        $this->assertNotEmpty($user);
        $this->assertEquals('Test User', $user['name']);
    }
}

Отличия в таблице:

Характеристика Стаб (Stub) Мок (Mock)
Назначение Предоставить данные для работы Проверить взаимодействие и данные
Проверка Не проверяет взаимодействие Проверяет, как объект работает с ним
Логика поведения Просто возвращает значения Содержит ожидания вызовов
Кто выполняет assert Тестируемый объект или клиент Сам мок (через ожидания)