Задать вопрос

Как правильно описать спецификацию (phpspec)?

Добрый день! Пытаюсь въехать в тестирование, а именно в 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()?

Вижу следующие варианты:
  1. создавать события через какой-нибудь EventBuilder, инжектив его в описываемый класс;
  2. публичные методы createRequestEvent(...) и createResponseEvent(...) на описываемом классе.

Первый вариант кажется слишком громоздким, второй - какой-то костыль. Какие есть еще варианты?
  • Вопрос задан
  • 774 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Весь смак PhpSpec проявляется как раз в таких случаях. Вам трудно мокать? Трудно писать тесты? Значит что-то с вашим кодом пошло не так (PhpSpec очень сильно ограничивает в том как и что можно тестить).

1) зачем вы инджектите контейнер целиком? Инджектите - тогда мокайте его и в методе get возвращайте мок для диспатчера событий
2) все что создается внутри метода не мокается. То есть коль уж вы делаете new в методе, значит так надо. Вы тут ничего не сделаете. А так как у нас есть мок ивент диспатчера - можно проверить что именно вы туда передаете.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы