#symfony #phpunit #symfony4
#symfony #phpunit #symfony4
Вопрос:
Я хочу внедрить ParameterBagInterface и EntityManagerInterface в мои модульные тесты (WebTestCase и KernelTestCase), но я не смог найти метод, который правильно возвращает их пространство имен и имя ( SymfonyComponentDependencyInjectionParameterBagParameterBagInterface
). есть ли способ сделать это?
то, что я пробовал, это:
$this->parameterBag = self::$container->get(ParameterBagInterface::class);
ВОЗВРАТ SymfonyComponentDependencyInjectionParameterBagContainerBag
$this->parameterBag = $this->prophesize(ParameterBagInterface::class)->reveal();
ВОЗВРАТ DoubleParameterBagInterfaceP1
$this->parameterBag = $this->createMock(ParameterBagInterface::class);
ВОЗВРАТ Mock_ParameterBagInterface_fccf09f9
Все мои классы используют ParameterBagInterface и имеют типовую подсказку как таковую.
Вот пример тестового класса:
/**
*
* @package AppTestsEntity
*/
class LogCollectTest extends WebTestCase
{
use CronManagerCron;
/**
* @var EntityManager
*/
private $em;
/**
* {@inheritDoc}
*/
protected function setUp()
{
self::bootKernel();
$this->parameterBag = self::$container->get(ParameterBagInterface::class);
}
/**
* Test saving click
*/
public function testSavingClick()
{
// truncate the log collect table to be sure to get the right click
$this->truncateLogCollectTable();
$userAgents = [...];
foreach ($userAgents as $agent => $expectedResult) {
// we make fake client requests and record them in database (test enviropment)
$clientStatus = $this->sendClientData($agent);
// the controller is resulting properly
$this->assertEquals(200, $clientStatus);
/**
* @var LogCollect $logCollectEntry
*/
$logCollectEntry = $this->em->getRepository(LogCollect::class)->getLast(); <--
...
// later we process this client requests with cron and later assert the data
$logCollectorCron = new LogCollectorCron(
$this->container,
$this->em,
$this->parameterBag,
'test'
);
$logCollectorCron->run();
...
}
Есть предложения?
Ответ №1:
Вы не получите никакого интерфейса, поскольку интерфейс по своей природе никогда не может быть создан, поэтому, чтобы было ясно: объект ParameterBagInterface не может существовать. Когда вы просите контейнер предоставить вам ParameterBagInterface, контейнер предоставляет вам сервис, который реализует этот интерфейс.