Ответ 1
Я боролся с модульной проверкой чего-то, что много полагается на контейнер услуг. Сначала я все время пытался насмехаться, как и ты. Это может сделать пропуск unit test с большим усилием (услуги имеют тенденцию полагаться на другие сервисы Symfony, которые также должны быть издевались), но требуется еще больше усилий, чтобы удостовериться, что передача теста означает, что это будет работать с данными, с которыми вы хотите работать.
Кроме того, модульное тестирование базы данных, как известно, сложно и редко обсуждается. Я не уверен, что то, что я использую, является "лучшим" ответом, но это ответ, который работал у меня, и это помогает unit test реальным услугам. Как таковой я нашел, что это более эффективный метод тестирования, чем насмехание сервисов.
Это основано на отличной статье, которую, конечно же, я не могу найти сейчас (я обновлю это, если найду это, чтобы отблагодарить их).
В принципе, вы можете настроить свои пакеты для тестирования контейнеров.
composer.json:
"require-dev": {
"sensio/framework-extra-bundle": ">=3.0",
"symfony/asset": ">=3.2"
}
Затем создайте config.yml
с любыми услугами, которые могут вам понадобиться, и минимальным минимальным для форм Symfony:
framework:
secret: 'shh'
form: ~
validation: { enable_annotations: true }
session:
storage_id: session.storage.mock_file
doctrine:
# your doctrine settings if you want to test against the DB
Создайте класс AppKernel.
class AppKernel extends Kernel
{
public function registerBundles()
{
return array(
new FrameworkBundle(),
new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
// any other bundles you need
);
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config.yml');
}
public function getLogDir()
{
return '/tmp/log/' . $this->environment;
}
}
Наконец, я создаю вспомогательный класс в моей базе TestCase:
protected function getContainer()
{
if (!isset($this->kernel)) {
$this->kernel = new AppKernel('test', true);
$this->kernel->boot();
}
if (!isset($this->container)) {
$this->container = $this->kernel->getContainer();
}
return $this->container;
}
Теперь вы можете получить доступ к любым зарегистрированным вам службам:
public function testContainerAccess()
{
$this->assertTrue(is_object($this->getContainer());
$this->assertTrue($this->getContainer()->get('doctrine.orm.entity_manager') instanceof \Doctrine\ORM\EntityManagerInterface);
}
Тестирование по базе данных всегда сложно и представляет собой отдельную банку червей. В этом случае проще всего было бы создать отдельную схему тестирования и запустить ваши запросы против этого.
Надеюсь, что это поможет.