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);
}