Функциональный тест Symfony: текущий запрос не установлен при извлечении службы из контейнера

Один из моих сервисов зависит от значения HTTP_HOST в объекте currentRequest из requestStack. Когда этот сервис используется в функциональном тесте, он работает, потому что я создаю клиент с параметром host:

$client = static::createClient(array(), array(
   'HTTP_HOST' => 'test.' . $this->domain
));

В какой-то момент мне нужно получить службу из контейнера, который зависит от запроса, поэтому я подумал, что использовал клиент, созданный со значением хоста, для получения службы:

$client->getKernel()->getContainer()->get('service')->someMethod();

Но объект запроса больше не устанавливается при вызове конструктора этой службы.

Можно ли каким-либо образом использовать эту службу в тестовой функции с зависимостью от объекта запроса?

Связанный код:

ControllerTest.php

//Create client with HTTP_HOST
$client = static::createClient(array(), array(
   'HTTP_HOST' => 'test.' . $this->domain
));

//Do some request services depending on the request object work because the client is initiated with the HTTP_HOST value
$crawler = $client->request('GET', $redirectUrl);        
$this->assertEquals(
   1,
   $crawler->filter('html:contains("feedback")')->count()
);

//Now I want to check if email feedback is send. This process starts in a EventSubsriber 
//I have to trigger this event myself because the $event variable consist of fake data.
$client->getContainer()->get('event_subscriber')->process($event);

//now collect the mail and do some checks
$mailCollector = $client->getProfile()->getCollector('swiftmailer');
$this->assertEquals(1, $mailCollector->getMessageCount());

person Jeroen    schedule 20.03.2018    source источник
comment
вы решили эту проблему? У меня такое же странное поведение с контейнером и службами в моих интеграционных тестах.   -  person Serhii Polishchuk    schedule 10.02.2019
comment
Похоже, у вас есть новые службы для каждого запроса, см. stackoverflow.com/a/11486700/2119164   -  person Serhii Polishchuk    schedule 10.02.2019
comment
@SerhiiPolishchuk Я еще не решил это. Ваш комментарий имеет смысл, но мой тест работает немного иначе.   -  person Jeroen    schedule 11.02.2019


Ответы (1)


Вы должны получить Контейнер непосредственно из созданного вами клиента, как описано в официальном документы:

$client->getContainer()->get('service')->someMethod();

Возможно, все еще необходимо издеваться над всей службой, но потребуются дополнительные примеры кода.

person Chris    schedule 20.03.2018
comment
Это приводит к той же ошибке, по-прежнему пропустите объект запроса. конечно, я мог бы издеваться над всеми зависимостями, но их много, и в конце я хочу проверить, отправляется ли какая-то почта. Мне было бы проще позволить контейнеру обрабатывать все зависимости - person Jeroen; 20.03.2018
comment
Но вы что-то запросили с помощью $client-›request('GET', 'whatever')? - person Chris; 20.03.2018
comment
Ну да, но отдельно, см. соответствующий код в моем обновленном ответе. - person Jeroen; 20.03.2018
comment
Профилировщик включен, как описано здесь symfony.com/doc/3.4/testing/profiling.html< /а>? - person Chris; 20.03.2018
comment
Да, я знаю, я пропустил несколько строк, потому что профилировщик не является частью проблемы. - person Jeroen; 21.03.2018
comment
Осталась только одна идея, возможно в вашем запросе есть редирект, поэтому $client-›followRedirects(false); прежде чем запрос может быть вариантом. Если вы создадите репозиторий на Github, я мог бы изучить его глубже. - person Chris; 21.03.2018