2012-04-04 23 views
5

मैं सिम्फनी 2, सिद्धांत और मोंगोडीबी के साथ परीक्षणों का एक सेट सुरक्षित बनाने की कोशिश कर रहा हूं।सिम्फनी 2 सिद्धांत मोंगोडीबी रोलबैक

मुझे परीक्षण करने के दौरान बहुत सारे फिक्स्चर लोड करना है, और इसे समाप्त होने के बाद उन्हें अनलोड करना है। मैंने इसे लेनदेन के साथ करने का विचार किया, लेकिन ... मुझे डॉक्टरेट और मोंगो के साथ इसे कैसे करना है, इस पर दस्तावेज़ नहीं मिला!

मुझे ओआरएम के साथ लेनदेन करने के तरीके के बारे में सिद्धांत दस्तावेज़ों में good documentation मिला, लेकिन ओडीएम के संबंध में नहीं।

तो मैं सिद्धांत-मोंगो द्वारा भी इस्तेमाल किया source code of the Connection.php वर्ग पर एक नज़र लिया और मैं नहीं मिला है beginTransaction, commit और rollback तरीकों कि dbal version उपयोग करता है।

मुझे नहीं पता था, तो मैंने पूछा कि अपने आप को "यह और भी MongoDB में रोलबैक करना संभव है?", और जवाब अगर MongoDB FAQ में पाया गया था:

MongoDB के साथ पारंपरिक ताला या जटिल लेनदेन का उपयोग नहीं करता

रोलबैक :(तो मुझे लगता है कि यही वजह है कि वहाँ कोई beginTransaction या जो भी ODM में है कि है ...

लेकिन मेरी समस्या बनी हुई है: मैं कैसे कर सकते हैं imple मेरे परीक्षणों के लिए रोलबैक का एक प्रकार बताओ?

मुझे अभी प्राप्त एकमात्र विचार है कि मैन्युअल रूप से मेरे द्वारा लोड किए गए दस्तावेज़ के सभी आईडी प्राप्त करें और फिर उन्हें tearDown() में हटा दें। लेकिन, अच्छा ... यह थोड़े बेकार है, है ना?

अन्य विचार ??

संपादित करें: इस सवाल का मेरा पहला टिप्पणी के बाद, तथ्य यह है कि मैं परीक्षण और विकास में एक ही डीबी करना चाहते हैं के बारे में, मैंने सोचा: क्यों एक अलग परीक्षण डेटाबेस का उपयोग नहीं करते, जहां परीक्षण शुरू होने पर विकास डेटाबेस की प्रतिलिपि बनाई जाती है, और इसे हल्के दिल से गिराया जा सकता है?

क्या यह एक बेहतर विचार हो सकता है? यह वास्तव में मेरे लिए आसान और अधिक सुरक्षित दिखता है। आप लोग क्या सोचते हैं?

धन्यवाद :)

+0

मैं यह कहना भूल गया कि मैं विकास और परीक्षण के लिए दो अलग-अलग डीबी का उपयोग नहीं कर रहा हूं, इसलिए एक सामान्य 'आंसू डाउन()' जो सबकुछ छोड़ देता है मेरे लिए कोई समाधान नहीं है ... – mokagio

उत्तर

4

मैं विकास के लिए दो अलग-अलग डीबीएस उपयोग नहीं कर रहा और

पता करने के लिए पहली बात यह है कि परीक्षण - एक परीक्षण डाटाबेस के बिना क्योंकि, चल परीक्षण अपने विकास db को प्रभावित करेगा और इसके विपरीत है जो एक भयानक विचार। आप अपने उत्पादन माहौल में पूर्ण आत्मविश्वास के साथ परीक्षण चलाने में सक्षम होना चाहिए कि परीक्षण में आप जो कुछ भी नहीं करते हैं, वह आपकी तैनाती साइट को प्रभावित करेगा।

सेटअप एक परीक्षण कनेक्शन

तो, कुछ इस तरह है करने के लिए अपने parameters.yml संशोधित: अपने एप्लिकेशन/config/config_test.yml फ़ाइल में

database.host: localhost 
database.port: 27017 
database.db: myappname 

database.test.host: localhost 
database.test.port: 27017 
database.test.db: myappname-test 

इसके अलावा, डिफ़ॉल्ट ओवरराइड कनेक्शन जो कि आप किसी भी परीक्षण के हिस्से के रूप में ट्रिगर करते हैं जो डिफ़ॉल्ट दस्तावेज़ प्रबंधक से अनुरोध करता है, आपके टेस्ट डीबी पर इंगित करने वाला प्रबंधक प्राप्त करेगा:

doctrine_mongodb: 
    document_managers: 
     default: 
      database: %database.test.db% 

जुड़नार

उसके बाद, आप को प्रभावी ढंग से करना चाहते हैं क्या साथ परीक्षण के लिए तैयार है:

  • प्रासंगिक संग्रह काटना
  • लोड जुड़नार अपने परीक्षण db प्रत्येक परीक्षा से पहले पर

यहाँ एक उदाहरण सार परीक्षण वर्ग है: - या नहीं

<?php 

use Doctrine\Common\DataFixtures\Executor\MongoDBExecutor as Executor, 
    Doctrine\Common\DataFixtures\Purger\MongoDBPurger as Purger, 
    Doctrine\Common\DataFixtures\Loader, 
    Doctrine\Common\DataFixtures\ReferenceRepository, 
    Symfony\Bundle\FrameworkBundle\Test\WebTestCase, 
    Symfony\Bundle\FrameworkBundle\Console\Application; 

abstract class AbstractTest extends WebTestCase 
{ 
    /** 
    * Array of fixtures to load. 
    */ 
    protected $fixtures = array(); 

    /** 
    * Setup test environment 
    */ 
    public function setUp() 
    { 
     $kernel = static::createKernel(array('environment' => 'test', 'debug' => false)); 
     $kernel->boot(); 
     $this->container = $kernel->getContainer(); 
     $this->dm = $this->container->get('doctrine.odm.mongodb.document_manager'); 

     if ($this->fixtures) { 
      $this->loadFixtures($this->fixtures, false); 
     } 
    } 

    /** 
    * Load fixtures 
    * 
    * @param array $fixtures names of _fixtures to load 
    * @param boolean $append append data, or replace? 
    */ 
    protected function loadFixtures($fixtures = array(), $append = true) 
    { 
     $defaultFixtures = false; 

     $loader = new Loader(); 
     $refRepo = new ReferenceRepository($this->dm); 

     foreach ((array) $fixtures as $name) { 
      $fixture = new $name(); 
      $fixture->setReferenceRepository($refRepo); 
      $loader->addFixture($fixture); 
     } 

     $purger = new Purger(); 
     $executor = new Executor($this->dm, $purger); 
     $executor->execute($loader->getFixtures(), $append); 
    } 
} 

उपयोग जुड़नार अपने परीक्षणों में

पिछले सार परीक्षण वर्ग के साथ

, तो आप जो अपने दृढ़ डेटा का उपयोग परीक्षण लिख सकते हैं - के रूप में उपयुक्त। नीचे एक मामूली उदाहरण है।

<?php 

use Your\AbstractTest, 
    Your\Document\Foo; 

class RandomTest extends AbstractTest 
{ 
    /** 
    * fixtures to load before each test 
    */ 
    protected $fixtures = array(
     'APP\FooBundle\DataFixtures\MongoDB\TestFoos', 
     'APP\FooBundle\DataFixtures\MongoDB\TestBars' 
    ); 

    ... 

    /** 
    * Check it gets an ID (insert succeeded) 
    * 
    */ 
    public function testCreateDefaults() 
    { 
     $foo = new Foo(); 
     $this->dm->persist($foo); 
     $this->dm->flush(); 

     $this->assertNotNull($foo->getId()); 
     $this->assertSame('default value', $foo->getSomeProperty()); 
     // etc. 
    } 

    /** 
    * Check result of something with a given input 
    * 
    */ 
    public function testSomething() 
    { 
     $foo = $this->dm->getRepository(APPFooBundle:Foo)->findByName('Some fixture object'); 

     $foo->doSomething(); 
     $this->assertSame('modified value', $foo->getSomeProperty()); 
     // etc. 
    } 

प्रत्येक परीक्षा से पहले, जुड़नार द्वारा निर्धारित किए गए लोड जाएगा (संग्रह वे प्रभावित छोटा), एक सुसंगत db राज्य है जिस पर अपने परीक्षण के आधार के लिए दे रही है।

+0

इस तरह का दृष्टिकोण वही है जो मैं ढूंढ रहा था (और मेरे पिछले संपादन के साथ मेरे दिमाग में क्या आया) मैं इस तथ्य से सहमत हूं कि एक ही डेटाबेस होना वास्तव में एक बुरा विचार है। यह मेरे लिए कुछ "लगाया गया" था, लेकिन मैं इसे अंतिम रूप में बदलने में सक्षम था :) – mokagio

+0

यह वास्तव में एक अच्छा समाधान है। दुर्भाग्यवश, यह केवल आपके कामों को आपके जुड़नार में कंटेनर जागरूकता की आवश्यकता नहीं है। एपीआई के माध्यम से कंटेनर-जागरूक फिक्स्चर लोड करना बिल्कुल काम नहीं करता है, जिससे त्रुटियां, फ्रीज और अन्य समस्याएं होती हैं। – Tom

+0

कंटेनर-जागरूकता को प्रभावित नहीं करना चाहिए कि परीक्षण डीबी कनेक्शन का उपयोग करना है या नहीं - अगर ऐसा लगता है कि आपके पास कुछ अंतर्निहित (डेटा) निर्भरताएं हैं जो आप लूप, त्रुटियों और सामान्य तबाही के कारण संतोषजनक नहीं हैं। जहां संभव हो - स्थिरता फ़ाइलों को चट्टानों के रूप में गूंगा होना चाहिए। – AD7six

1

बस प्रत्येक परीक्षा से पहले अपने MongoDB डेटाबेस ड्रॉप और फिर जुड़नार आप की जरूरत लोड। इस तरह प्रत्येक परीक्षा पूरी तरह से अलग हो जाएगी।

+0

आपने जवाब दिया था और जब मैं इसे संपादित कर रहा था सवाल का विकल्प। :) – mokagio

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