Добрый день! Пытаюсь въехать в тестирование, а именно в SpecBDD (PHPSpec). Возник небольшой вопрос.
Есть метод
run() (понятно, что до написания спецификации кода быть не должно, он просто для примера):
public function run()
{
/** @var EventDispatcherInterface $eventDispatcher */
$eventDispatcher = $this->container
->get('event_dispatcher');
$eventDispatcher->dispatch(static::EVENT_RUN);
if ($this->request) {
$request = $this->request;
} else {
$request = Request::createFromGlobals();
}
$requestEvent = new RequestEvent($request);
$eventDispatcher->dispatch(static::EVENT_REQUEST, $requestEvent);
if (!$requestEvent->getResponse()) {
throw new NoResponseException();
}
$responseEvent = new ResponseEvent($requestEvent->getRequest(), $requestEvent->getResponse());
$eventDispatcher->dispatch(static::EVENT_RESPONSE, $responseEvent);
$responseEvent->getResponse()
->send();
}
Вопрос в следующем: как мне правильно замокать
$requestEvent и
$responseEvent, для того, чтобы проверить вызовы
$eventDispatcher->dispatch(...) и подменить возвращаемое значение в
$requestEvent->getResponse()?
Вижу следующие варианты:
- создавать события через какой-нибудь EventBuilder, инжектив его в описываемый класс;
- публичные методы createRequestEvent(...) и createResponseEvent(...) на описываемом классе.
Первый вариант кажется слишком громоздким, второй - какой-то костыль. Какие есть еще варианты?