Чем отличается stop от мока
В ООП и, в частности, в тестировании, существуют разные методы и инструменты для создания поддельных объектов, которые используются для замены реальных зависимостей в тестах. Два из таких методов — это stubs (стабы) и mocks (моки). Они имеют разные цели и используются по-разному.
Stubs (Стабы)
Это простые поддельные объекты, которые возвращают заранее заданные данные, когда их методы вызываются. Они не проверяют, как они были вызваны, а лишь предоставляют фиксированные ответы, необходимые для теста.
Основные характеристики:
- Цель: Возврат фиксированных значений.
- Использование: Подставляют зависимости, чтобы изолировать тестируемый код от внешних влияний.
- Проверка: Не проверяют взаимодействия с тестируемым кодом.
```php
class User {
private $database;
public function __construct(Database $database) {
$this->database = $database;
}
public function getUserName($userId) {
return $this->database->fetchUserName($userId);
}
}
class DatabaseStub {
public function fetchUserName($userId) {
return 'John Doe';
}
}
$databaseStub = new DatabaseStub();
$user = new User($databaseStub);
echo $user->getUserName(1); // Выведет "John Doe"
```В этом примере `DatabaseStub` возвращает фиксированное значение `'John Doe'`, когда вызывается метод `fetchUserName`.
Mocks (Моки)
Это поддельные объекты, которые не только возвращают фиксированные данные, но и проверяют, как они были вызваны. Моки позволяют задавать ожидания относительно вызовов их методов и проверяют, что эти ожидания выполнены во время выполнения теста.
Основные характеристики:
- Цель: Проверка взаимодействий и поведения.
- Использование: Подменяют зависимости и проверяют, как тестируемый код взаимодействует с ними.
- Проверка: Проверяют вызовы методов, аргументы вызовов и количество вызовов.
```php
use PHPUnit\Framework\TestCase;
class UserTest extends TestCase {
public function testGetUserName() {
// Создаем мок объекта Database
$databaseMock = $this->createMock(Database::class);
// Задаем ожидания: метод fetchUserName должен быть вызван с аргументом 1 и вернуть 'John Doe'
$databaseMock->expects($this->once())
->method('fetchUserName')
->with($this->equalTo(1))
->willReturn('John Doe');
$user = new User($databaseMock);
$this->assertEquals('John Doe', $user->getUserName(1));
}
}
```В этом примере мы используем PHPUnit для создания мока `Database`. Мы задаем ожидание, что метод `fetchUserName` будет вызван один раз с аргументом 1 и вернет `'John Doe'`.
Основные отличия:
1. Назначение:
- Стабы: Возвращают заранее заданные данные, изолируя тестируемый код от реальных зависимостей.
- Моки: Проверяют взаимодействия и поведение тестируемого кода с его зависимостями.
2. Фокус:
- Стабы: Сфокусированы на данных, которые возвращаются.
- Моки: Сфокусированы на том, как методы были вызваны, с какими аргументами и сколько раз.
3. Простота:
- Стабы: Просты в реализации и не проверяют взаимодействия.
- Моки: Более сложные, так как включают проверки взаимодействий и поведения.
Если объяснить совсем просто: стабы возвращают заранее заданные ответы, а моки проверяют, как именно и сколько раз их методы были вызваны.
June 1, 2024, easyoffer
