Главная

мОкаем компонент Yii2

Хорошо написанный код - это также тестируемый код, слабосвязанный с другими компонентами, код следует принципу единой ответственности, нет явных зависимостей и так далее. Мы все знаем правила, но всегда есть исключение.

Это довольно распространенная ситуация для модульного тестирования компонента или контроллера, который зависит от другого основного компонента Yii. Например, диспетчер событий

class EventDispatcher extends Component
{ 
    public function dispatch($event)
    {
        $this->trigger(get_class($event), $event);
    }
}

Переписать библиотеку, чтобы удалить явные зависимости, не всегда возможно, потому что это может привести к массовому рефакторингу и фактически сломать больше вещей, чем получить выгоду.

В таком случае я действительно хочу временно назначить \Yii::$app->eventDispatcher PHPUnit Mock Class, чтобы я мог переопределить возвращаемое значение метода dispatch(), например

$eventDispatcherMock = $this->getMockClass(EventDispatcher::class, ['dispatch']);
\Yii::$app->set('eventDispatcher', $eventDispatcherMock);

После данных преобразований метод dispatch() будет возвращать null, следовательно события вызвано не будет.

Роберт Фатхуллин

Статья Роберт Фатхуллин

Backend Developer