2012-08-05 6 views
19

Z Smyfony2 i Doctrin2, terminarz danych mogą być tworzone za pomocą następującego przykładu: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.htmlŚrodowisko Oprawy specyficznych danych z Symfony + Nauki

Co chciałbym jest aby móc używać tego pojęcia do badań tak, że Instalator/przerywaniem może stworzyć czyste środowisko danych testowych do testowania funkcjonalnego. W jaki sposób mogę zadbać o posiadanie określonego zestawu urządzeń testowych uruchamianych podczas testów funkcjonalnych i jak oddzielić te urządzenia od standardowych urządzeń, aby polecenie konsoli je ignorowało?

Wydaje się, że sposobem na zrobienie tego byłoby skopiowanie funkcjonalności doktryny: polecenie konsoli urządzeń i przechowywanie urządzeń testowych w innym miejscu. Czy ktoś ma lepsze rozwiązanie?

Odpowiedz

35

Alternatywą dla rozbijania urządzeń według katalogu jest użycie niestandardowej klasy urządzenia. Twoje zajęcia osprzętu by następnie rozszerzyć tę klasę i określić środowisk będzie faktycznie być załadowane w

<?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(); 
} 

Twoje mecze będzie w końcu wygląda tak:.

<?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'); 
    } 
} 

Wierzę, że to powinno działać w obie ORM dla urządzeń danych ODM.

+5

to jest geniusz! – ferdynator

+2

Jak definiujesz środowisko z konsoli? Używanie 'php app/console fixture: load --env = prod'? – xDaizu

+0

Odpowiadając na siebie: Yesh, 'php app/console fixture: load --env = prod', który działa z dostarczonym rozwiązaniem :) – xDaizu

17

Najprostszym sposobem jest umieszczenie urządzeń w różnych folderach, a następnie załadowanie ich za pomocą polecenia php app/console doctrine:fixtures:load --fixtures=../src/Acme/TestBundle/DataFixtures/ORM/test. Opcja fixtures musi wskazywać względną ścieżkę z miejsca, w którym znajduje się folder aplikacji!

Następnie można podzielić dane na wstępne, testowe i tak dalej lub utworzyć dev, test, inscenizację, prod fixtures, tak jak lubisz.

Jeśli chcesz je miksować, nie znam lepszego rozwiązania niż to, co zrobiłem: Tworzę folder "templates", w którym znajdują się wszystkie urządzenia. W folderze dev tworzę jedną klasę, która rozszerza właściwą klasę urządzeń z szablonu i dostosowuje to, co jest potrzebne do dostosowania (np. przesłonięcie metody getOrder). To nie jest doskonałe i myślę, że można by pomyśleć o rozszerzeniu urządzeń: ładuj polecenie, aby wziąć wiele ścieżek, ale działa to dla mnie.

+0

To brzmi jak dobry początek. Dzięki! –