Как правильно описать спецификацию (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(...) на описываемом классе.

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

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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 11:49
25000 руб./за проект
25 апр. 2024, в 11:37
40000 руб./за проект