Встречается на собеседованиях • сегодня

Чем отличается stop от мока

В ООП и, в частности, в тестировании, существуют разные методы и инструменты для создания поддельных объектов, которые используются для замены реальных зависимостей в тестах. Два из таких методов — это stubs (стабы) и mocks (моки). Они имеют разные цели и используются по-разному.

Stubs (Стабы)
Это простые поддельные объекты, которые возвращают заранее заданные данные, когда их методы вызываются. Они не проверяют, как они были вызваны, а лишь предоставляют фиксированные ответы, необходимые для теста.

Основные характеристики:

  • Цель: Возврат фиксированных значений.
  • Использование: Подставляют зависимости, чтобы изолировать тестируемый код от внешних влияний.
  • Проверка: Не проверяют взаимодействия с тестируемым кодом.
text
```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 (Моки)
Это поддельные объекты, которые не только возвращают фиксированные данные, но и проверяют, как они были вызваны. Моки позволяют задавать ожидания относительно вызовов их методов и проверяют, что эти ожидания выполнены во время выполнения теста.

Основные характеристики:

  • Цель: Проверка взаимодействий и поведения.
  • Использование: Подменяют зависимости и проверяют, как тестируемый код взаимодействует с ними.
  • Проверка: Проверяют вызовы методов, аргументы вызовов и количество вызовов.
text
```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

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы