Подтвердить что ты не робот

Среда, связанная с окружающей средой, с Symfony + Doctrine

С Smyfony2 и Doctrin2 данные могут быть созданы с использованием следующего примера: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html

Я бы хотел использовать эту концепцию для тестирования, чтобы setup/teardown могли создавать чистую среду тестовых данных для функционального тестирования. Как я могу использовать определенный набор тестов для тестирования во время функциональных тестов и как отделить эти приборы от стандартных инструментов, чтобы команда консоли игнорировала их?

Кажется, что способ сделать это - это реплицировать функциональные возможности доктрины: команда консоли fixtures и хранить тестовые приборы в другом месте. У кого-нибудь есть лучшее решение?

4b9b3361

Ответ 1

Альтернативой выделению светильников по каталогу является использование специального класса приборов. Затем ваши классы приборов расширяют этот класс и определяют среды, в которые он будет загружен.

<?php

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\KernelInterface;

/**
 * Provides support for environment specific fixtures.
 *
 * This container aware, abstract data fixture is used to only allow loading in
 * specific environments. The environments the data fixture will be loaded in is
 * determined by the list of environment names returned by `getEnvironments()`.
 *
 * > The fixture will still be shown as having been loaded by the Doctrine
 * > command, `doctrine:fixtures:load`, despite not having been actually
 * > loaded.
 *
 * @author Kevin Herrera <[email protected]>
 */
abstract class AbstractDataFixture implements ContainerAwareInterface, FixtureInterface
{
    /**
     * The dependency injection container.
     *
     * @var ContainerInterface
     */
    protected $container;

    /**
     * {@inheritDoc}
     */
    public function load(ObjectManager $manager)
    {
        /** @var KernelInterface $kernel */
        $kernel = $this->container->get('kernel');

        if (in_array($kernel->getEnvironment(), $this->getEnvironments())) {
            $this->doLoad($manager);
        }
    }

    /**
     * {@inheritDoc}
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    /**
     * Performs the actual fixtures loading.
     *
     * @see \Doctrine\Common\DataFixtures\FixtureInterface::load()
     *
     * @param ObjectManager $manager The object manager.
     */
    abstract protected function doLoad(ObjectManager $manager);

    /**
     * Returns the environments the fixtures may be loaded in.
     *
     * @return array The name of the environments.
     */
    abstract protected function getEnvironments();
}

Ваши светильники выглядят так:

<?php

namespace Vendor\Bundle\ExampleBundle\DataFixtures\ORM;

use AbstractDataFixture;
use Doctrine\Common\Persistence\ObjectManager;

/**
 * Loads data only on "prod".
 */
class ExampleData extends AbstractDataFixture
{
    /**
     * @override
     */
    protected function doLoad(ObjectManager $manager)
    {
        // ... snip ...
    }

    /**
     * @override
     */
    protected function getEnvironments()
    {
        return array('prod');
    }
}

Я считаю, что это должно работать как с ORM, так и с данными ODM.

Ответ 2

Самый простой способ - поместить ваши светильники в разные папки, а затем загрузить их с помощью команды php app/console doctrine:fixtures:load --fixtures=../src/Acme/TestBundle/DataFixtures/ORM/test. Опция fixtures должна указывать на относительный путь от папки приложения!

Затем вы можете разбить свои данные на начальные, тестовые и т.д. или создать инструменты разработчика, тестирования, постановки, создания профайлов, как вам нравится.

Если вы хотите их смешивать, я не знаю лучшего решения, чем то, что я сделал: я создаю папку "шаблонов", в которой находятся все приспособления. В моей папке dev я создаю один класс, который расширяет класс приспособления из шаблона и настраивает то, что необходимо для настройки (например, переопределение метода getOrder). Это не идеально, и я думаю, что можно было бы подумать о расширении приборов: load command, чтобы принимать несколько путей, но это работает для меня.