Skip to content
...

Mockery

Mockery — популярная библиотека мокирования для PHP с выразительным API (Mockery::mock(), expects(), spy()). Пакет testo/bridge-mockery интегрирует её с Testo.

Класс плагина: MockeryPlugin\Testo\Bridge\Mockery\MockeryPlugin. Не входит в состав плагинов по умолчанию.

Установка

bash
composer require --dev mockery/mockery testo/bridge-mockery

Подключение

Зарегистрируйте MockeryPlugin\Testo\Bridge\Mockery\MockeryPlugin в секции plugins — на уровне приложения (для всех сьютов) или отдельного Test Suite (для конкретного набора тестов).

php
use Testo\Application\Config\ApplicationConfig;
use Testo\Bridge\Mockery\MockeryPlugin;

return new ApplicationConfig(
    src: ['src'],
    suites: [ /** Suites **/ ],
    plugins: [
        new MockeryPlugin(),
    ],
);
php
use Testo\Application\Config\SuiteConfig;
use Testo\Bridge\Mockery\MockeryPlugin;

new SuiteConfig(
    name: 'Unit',
    location: ['tests/Unit'],
    plugins: [
        new MockeryPlugin(),
    ],
);

Поведение проверок моков

Адаптер автоматически проверяет ожидания моков после каждого теста и связывает результат со статусами Testo — ручной teardown не нужен. Правило простое: задекларировали ожидание и выполнили — хорошо, не выполнили — ошибка.

  • Выполненное ожидание засчитывается как проверка. Поэтому тест, где единственная проверка — мок, остаётся Status::Passed\Testo\Core\Value\Status::Passed, а не Status::Risky\Testo\Core\Value\Status::Risky (этим статусом Testo помечает успешный тест без единой проверки — защита от забытого ассерта, см. Assert).
  • Невыполненное ожидание проваливает тест (Failed) и попадает в историю проверок как неуспешное.
php
#[Test]
public function notifies(): void
{
    $mailer = Mockery::mock(Mailer::class);
    $mailer->expects('send')->once();       // ожидание — и есть проверка

    (new Notifier($mailer))->notify('hi');  // send() вызывается один раз, выполняя ожидание
}
php
#[Test]
public function notifies(): void
{
    $mailer = Mockery::spy(Mailer::class);

    (new Notifier($mailer))->notify('hi');
    // ни ожидания, ни ассерта — проверять нечего → Risky
}
php
#[Test]
public function notifies(): void
{
    $mailer = Mockery::mock(Mailer::class);
    $mailer->expects('send')->once();       // ждём ровно один вызов send()

    // …но notify() так и не вызвали → ожидание не выполнено → Failed
}

Плагин настроен только на обычные тесты (например, помеченные атрибутом #[Test]#[Test()]Явно помечает метод, функцию или класс как тест.). Во встроенных тестах, бенчмарках и других моки автоматически не проверяются и не очищаются — этим придётся управлять самостоятельно средствами Mockery.