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