2017-01-27 28 views
7

adresine rağmen boştu Testing Symfony Apps with a Disposable Database Eğitim Kitabı site noktalarını izledim. Testcase'imde Fikstür ekledim ve SetUp sırasında herhangi bir Hata görülmedi. Armatürlerde bir Hata eklediysem (no. Nullable = false alan boş) Hata gösterilir, bu yüzden bu kod kesinlikle çalıştırılır.Bellekte, sqlite her zaman kurulum

Benim Yapılandırma: my WebTestCase içinde

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

Benim SetUp:

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

Oysa benim WebTestCase içinde hiçbir Tablolar var olmadığı anlaşılıyor. Çıktı, masamın mevcut olmadığını söyleyen bir Doktrin Özel Durumunu atar.

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

herkes söyledi kullanarak başarılı olmuş öğretici veya ünite testleri için sqlite bellek db kullanarak ve herhangi bir ipucu vardır:

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

i bir dosyaya sql_lite geçerseniz, her şey başka hiçbir değişiklik yapmadan çalışıyor ya da fikirler?

Güncelleştirme: Çekirdeğimin kapatılmadığından emin olmak için Kur'u şuna değiştirdim. Bu yardım etmedi:

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

Bağlantı adını 'memory', ör.' Default_connection: memory' '' default_connection: default' ya da başka bir addan değiştirmeyi denediniz mi? Bu ayrılmış sözcüğün kullanılması (bağlantı verilerinde bir özellik olduğu için) bir soruna neden oluyor olabilir. Fikstür dosyanızı da göndermeye değer olabilir. –

+0

@JohnJoseph: Bunu denedim, yine de farketmedi. Benim fikstür dosya oldukça büyük, bu yüzden bunu yapmak değil. Ayrıca, daha fazla sqllte dosyasında çalıştığından, benim fikstür sorun olduğunu sanmıyorum. –

+0

Yine de, çekirdeğinizin bir şekilde kapatılmasını/yeniden başlatılmasını düşünüyorum.Nerede olduğunu bulmak için, 'print (" bootKernel "(" n ") denilen \ n"); debug_print_backtrace(); '' bootKernel() 'işlevinin üstünde' vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Test/KernelTestCase.php' öğesinin üst kısmında ve ardından etkilenen sınama durumlarından birini çalıştırın. – aferber

cevap

1

Sana test fonksiyonları createClient() diyoruz varsayalım. createClient()'un yaptığı ilk şey, static::bootKernel() numaralı telefonu aramaktır. Bu temelde, setUp()'da başlattığınız çekirdeğin kapatıldığını ve yeni bir çekirdek belleğinin yeni bir bellek SQLite veritabanı örneği ile önyüklendiği anlamına gelir.

Sen bootKernel() yerine senin setUp() içine createClient() çağrıyı taşıyabilir, bu önlemek için:

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

İyi Nokta, henüz bu benim Testlerimde zaten yapıldı: '' '' korumalı işlev setUp() { parent :: setUp(); $ this-> client = $ this-> makeClient(); ... '' ' –

+0

Belki de bize test fonksiyonlarından birini göstermelisin. – aferber

0

zaman istekten sonra

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

çağırır

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

çekirdek varsayılan olarak kapanıyor ve bellek içi veritabanı çöpe atıldı.

Eğer test kurulumu() fonksiyonunda

client->disableReboot(); 

ararsanız, bu irade davranışı devre dışı bırakılır, ve bütün paketi çalıştırabilirsiniz.