PHPUnit работает с Slim и PHP-DI

Я думаю, что у меня есть недостаток дизайна в моем приложении. Я объясню почему.

У меня есть обертка вокруг httpclient, который вводится (через php-di) во все виды других классов.

Я использую Slim для создания API. Когда вызов входит в мое приложение, Slim направит его к нужному контроллеру, в который введен httpclient. (на самом деле это не тот контроллер, который вводит httpclient, но я пытаюсь сделать его простым для примера)

Теперь перейдем к тестированию юнитов. Я использую файл начальной загрузки для инициализации slim (с помощью моста php-di). У меня есть разные файлы для каждой среды. Таким образом, другой класс (заглушка, если хотите) вставляется как httpclient в контроллеры.

Все идет нормально. Теперь я хочу изменить результат этой заглушки httpclient на мои пожелания. Как это:

// Arrange
$request = ..;
$response = ..;
$httpclientStub->setResponseMessage($response);

//Act
$response = $app->process($request, new Response());

//Assert
..

К сожалению, я не могу получить доступ к $ httpclientStub из тестовой функции. Сейчас я использую одноэлементный класс для передачи переменных из тестов в заглушки. Что довольно некрасиво.

Любые предложения для лучшего решения заглушки?

1 ответ

Я использовал следующий метод, который вообще не требует использования синглтона. Мы меняем контейнер во время выполнения теста. Это чувствует себя намного менее хакерским.

public function setResponseMessage(HttpMessage $response)
    {
      $httpClient = new \Stub\HttpClientStub();
      $httpClient->setResponseMessage($response);

      $container = $this->app->getContainer();
      $container->set(\Helper\IHttpClient::class, $httpClient);
    }
Другие вопросы по тегам