Sobes.tech
Middle

Какво са мокове и стаби? Как се различават?

sobes.tech AI

Отговор от AI

Мокове и стабове — това са типове тестови дублери, които се използват при модулното тестване за имитация на поведението на реалните зависимости на обекта.

Стаб (Stub):

  • Предоставя "застъпващо" поведение за тестов сценарий.
  • Отговаря на извикванията на методи, връщайки предварително зададени стойности.
  • Не проверява взаимодействията. Целта му е да осигури данни за тестируемия обект за продължаване на работата.

Мок (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 Тестируемият обект или клиент Самият мок (чрез очаквания)