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