2017-01-27 13 views
7

मैंने साइटपॉइंट्स Testing Symfony Apps with a Disposable Database ट्यूटोरियल का पालन किया। मैंने अपने टेस्टकेस में फिक्स्चर जोड़े और सेटअप के दौरान कोई त्रुटि दिखाई नहीं दी। अगर मैं फिक्स्चर में एक त्रुटि जोड़ता हूं (उदा। एक शून्य/झूठी फ़ील्ड खाली छोड़कर) त्रुटि दिखायी जाती है, इसलिए यह कोड निश्चित रूप से निष्पादित हो जाता है।मेमोरी sqlite में सेटअप के बावजूद हमेशा खाली

मेरे कॉन्फ़िग:

doctrine: 
    dbal: 
     default_connection: memory 
     connections: 
      memory: 
       driver: pdo_sqlite 
       memory: true 
       charset: UTF8 

मेरी WebTestCase में मेरे सेटअप:

protected function setUp() { 
    parent::setUp(); 
    self::bootKernel(); 
    DatabasePrimer::prime(self::$kernel); 
    $this->loadFixtures([ 
     'AppBundle\DataFixtures\ORM\UserData', 
     'AppBundle\DataFixtures\ORM\ArtistData' 
    ]); 
} 

फिर भी, मेरी WebTestCase में ऐसा लगता है कि कोई टेबल्स मौजूद हैं। आउटपुट एक सिद्धांत अपवाद फेंकता है कि मेरी तालिका मौजूद नहीं है।

SQLSTATE[HY000]: General error: 1 no such table: my_user_table 

मैं एक फ़ाइल में sql_lite पर जाते हैं तो सब कुछ किसी अन्य बदलाव के बिना ठीक काम करता है:

dbal: 
    default_connection: file 
    connections: 
     file: 
      driver: pdo_sqlite 
      path:  %kernel.cache_dir%/test.db 
      charset: UTF8 

किसी को भी कहा से सफलता मिली ट्यूटोरियल या इकाई परीक्षण के लिए एक SQLite स्मृति डाटाबेस का उपयोग कर और किसी भी संकेत है या विचार?

अद्यतन: मैंने यह सुनिश्चित करने के लिए कर्नेल को बंद नहीं किया है, इस पर मैंने अपना सेटअप बदल दिया है। यह मदद नहीं की:

parent::setUp(); 
$this->client = $this->getClient(); 
MemoryDbPrimer::prime(self::$kernel); 
$this->loadFixtures([ 
    'AppBundle\DataFixtures\ORM\UserData', 
    'AppBundle\DataFixtures\ORM\ArtistData' 
]); 
+0

क्या आपने 'मेमोरी' से कनेक्शन नाम बदलने की कोशिश की है, उदाहरण के लिए 'default_connection: memory'' default_connection: default' या कुछ अन्य नाम? हो सकता है कि उस आरक्षित शब्द का उपयोग (क्योंकि यह कनेक्शन डेटा के भीतर ही एक संपत्ति है) एक मुद्दा पैदा कर रहा है। यह आपकी स्थिरता फ़ाइल भी पोस्ट करने लायक हो सकता है। –

+0

@ जॉन जोसेफ: मैंने कोशिश की, फिर भी इससे कोई फर्क नहीं पड़ता। मेरी फिक्स्चर फाइल काफी बड़ी है इसलिए मैं ऐसा नहीं करूँगा। इसके अलावा, चूंकि यह sqllte फ़ाइल में अधिक काम करता है, मुझे संदेह है कि मेरे जुड़नार समस्या हैं। –

+0

मुझे अभी भी लगता है कि आपका कर्नेल किसी भी तरह से बंद/रीबूट हो जाता है।कहां पता लगाने के लिए, आप 'print (" bootKernel() को \ n ") जोड़ सकते हैं; debug_print_backtrace(); 'विक्रेता/सिम्फनी/सिम्फनी/src/सिम्फनी/बंडल/फ्रेमवर्कबंडल/टेस्ट/कर्नेलटेस्टकेस.एफ़पी' में 'बूट कर्नेल()' फ़ंक्शन के शीर्ष पर और फिर प्रभावित परीक्षण मामलों में से एक चलाएं। – aferber

उत्तर

1

मुझे लगता है आप अपने परीक्षण कार्यों में createClient() कहते हैं। सबसे पहले बात यह है कि createClient() कॉल static::bootKernel() है। इसका मूल रूप से अर्थ है कि आपके setUp() में बूट किए गए कर्नेल को बंद कर दिया गया है और स्मृति SQLite डेटाबेस के ताजा उदाहरण के साथ एक नया कर्नेल बूट किया गया है।

आप अपने setUp() में createClient() कॉल स्थानांतरित कर सकते हैं, bootKernel() बदलने से, इस से बचने के लिए:

class MyTest extends WebTestCase 
{ 
    private $client = null; 

    public function setUp() 
    { 
     $this->client = static::createClient(); 
     // prime database 
    } 

    public function testSomething() 
    { 
     $crawler = $this->client->request('GET', '/'); 
     // ... 
    } 
} 
+0

अच्छा प्वाइंट, फिर भी, यह पहले से ही मेरे टेस्ट में किया गया है: '' '' संरक्षित फ़ंक्शन सेटअप() { पैरेंट :: सेटअप(); $ यह-> ग्राहक = $ यह-> makeClient(); ... '' '' –

+0

शायद आपको हमें अपने परीक्षण कार्यों में से एक दिखाना चाहिए। – aferber

0

जब आप

$client->request(<METHOD>, <URL>); 

जो

Symfony\Bundle\FrameworkBundleClient::doRequest($request) 

कॉल अनुरोध के बाद कर्नेल डिफ़ॉल्ट रूप से बंद हो जाता है, और आपका इन-मेमोरी डेटाबेस ट्रैश किया गया है।

अगर आप अपने परीक्षण की स्थापना() फ़ंक्शन में

client->disableReboot(); 

कहते हैं, इस वसीयत व्यवहार अक्षम किया गया है, और आप पूरा समूह चला सकते हैं।

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