Доступ к файлу ресурса в тестовой директории в Symfony

В настоящее время у меня есть структура каталогов, как:

src
-App
--MyBundle
---Service
----DefaultService
tests
-AppMyBundle
--files
---data.csv
--Service
---DefaultServiceTest

Я пишу тест для чтения файлов, и я добавил data.csv файл для демонстрационного файла для теста. В моем тесте мне нужно получить путь этого data.csv файл. Но я не мог найти способ получить это. Я пытался получить доступ к нему через file_locator сервис как:

$locator = $this->container->get('file_locator');
$path = $locator->locate('@AppMyBundle/Tests/files/data.csv');

а также

$locator = $this->container->get('file_locator');
$path = $locator->locate('@AppMyBundle/files/data.

Без удачи. пространства имен, если это необходимо моего DefaultService является App\MyBundle\Service а для DefaultServiceTest есть App\MyBundle\Tests\Service

2 ответа

Решение

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

$path = $this->get('kernel')->getRootDir() . '/../tests/AppMyBundle/files/data.csv';

В настоящее время я делаю это при написании модульных тестов (которые анализируют файл Excel) с использованием Symfony 5, PHPUnit 7.5. Мой подход намного проще. Мои тесты построены так:

tests
- Service
-- ManifestReaderTest.php
-- testdata
--- import_test_good.csv

Затем в моем классе ManifestReaderTest у меня есть следующее:

$this->assertFileExists(__DIR__ . "/testdata/import_test_good.csv" );

Таким образом, я не полагаюсь на внешние классы или службы.

Я использовал $client->getContainer()->getParameter('kernel.root_dir') как это:

$client = static::createClient();

$schemaPath = sprintf(
    '%s/../tests/MyBundle/Resources/rss2.xsd',
    $this->_client->getContainer()->getParameter('kernel.root_dir')
);
Другие вопросы по тегам