2012-08-05 16 views
19

Smyfony2 और Doctrin2 के साथ, डेटा जुड़नार निम्न उदाहरण का उपयोग कर बनाया जा सकता है कार्यात्मक परीक्षण के लिए एक शुद्ध परीक्षण डेटा वातावरण बना सकते हैं। कार्यात्मक परीक्षणों के दौरान चलने वाले परीक्षण-केवल फिक्स्चर का एक विशिष्ट सेट होने के बारे में मैं कैसे जा सकता हूं और मैं इन फिक्स्चर को अपने मानक फिक्स्चर से कैसे अलग कर सकता हूं ताकि कंसोल कमांड उन्हें अनदेखा कर सके?पर्यावरण Symfony + सिद्धांत के साथ विशिष्ट डेटा जुड़नार

ऐसा लगता है कि ऐसा करने का तरीका सिद्धांत की कार्यक्षमता को दोहराना होगा: फिक्स्चर कंसोल कमांड और परीक्षण फिक्स्चर कहीं और स्टोर करें। क्या किसी के पास बेहतर समाधान है?

उत्तर

35

निर्देशिका द्वारा फिक्स्चर को तोड़ने का एक विकल्प कस्टम फ़िक्स्चर क्लास का उपयोग करना है। आपका स्थिरता कक्षाएं तो इस वर्ग का विस्तार करने और वातावरण यह वास्तव में लोड किया जाएगा निर्दिष्ट करना होगा

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

मुझे विश्वास है कि यह दोनों के साथ काम करना चाहिए ओआरएम एक ओडीएम डेटा फिक्स्चर।

+5

यह प्रतिभाशाली है! – ferdynator

+2

आप पर्यावरण को कंसोल से कैसे परिभाषित करते हैं? 'Php ऐप/कंसोल स्थिरता का उपयोग करना: लोड --env = prod'? – xDaizu

+0

खुद का जवाब: यश, 'php ऐप/कंसोल स्थिरता: लोड --env = prod' जो प्रदत्त समाधान के साथ काम करता है :) – xDaizu

17

सबसे आसान तरीका है कि आप अपने जुड़नार को विभिन्न फ़ोल्डरों में रखें और फिर php app/console doctrine:fixtures:load --fixtures=../src/Acme/TestBundle/DataFixtures/ORM/test कमांड के साथ लोड करें। फिक्स्चर विकल्प को आपके ऐप फ़ोल्डर से रिश्तेदार पथ को इंगित करना होगा!

फिर आप अपने डेटा को शुरुआती, परीक्षण और इतने पर विभाजित कर सकते हैं या देव, टेस्ट, स्टेजिंग, प्रोड फिक्स्चर, जैसे आप चाहें उतना ही बना सकते हैं।

यदि आप उन्हें मिश्रण करना चाहते हैं, तो मैंने जो कुछ किया है उससे मुझे कोई बेहतर समाधान नहीं पता: मैं एक "टेम्पलेट्स" फ़ोल्डर बनाता हूं जहां सभी फिक्स्चर रहते हैं। मेरे देव फ़ोल्डर में, मैं एक वर्ग बनाता हूं जो विस्तारित करता है टेम्पलेट से उचित स्थिरता वर्ग और समायोजित करने के लिए आवश्यक समायोजन (जैसे getOrder विधि ओवरराइड करना)। यह सही नहीं है और मुझे लगता है कि कोई फिक्स्चर को विस्तारित करने के बारे में सोच सकता है: एकाधिक पथ लेने के लिए लोड कमांड, लेकिन यह मेरे लिए काम करता है।

+0

यह अच्छी शुरुआत की तरह लगता है। धन्यवाद! –

संबंधित मुद्दे