2017-01-27 5 views
7

사이트 포인트 Testing Symfony Apps with a Disposable Database 자습서를 따랐습니다. 테스트 케이스에 Fixtures를 추가했는데 SetUp 중에 오류가 나타나지 않습니다. 조명기에 오류 (예 : , nullable = false 필드를 비워두면)를 표시하면 오류가 표시되므로이 코드가 올바르게 실행됩니다.메모리에 sqlite가 항상 비어 있음

내 구성 : 내 WebTestCase에서

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

내 설정 :

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

그러나, 내 WebTestCase에 어떤 테이블이 존재하지 않는 것으로 보인다. 출력 결과 내 테이블이 존재하지 않는다는 Doctrine Exception이 발생합니다.

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

누구나 말했다으로 성공을 거두었 튜토리얼 또는 단위 테스트에 대한 SQLite는 메모리 DB를 사용하고 힌트가 있습니다

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

내가 파일에 sql_lite로 전환하면, 모든 다른 변경 사항없이 잘 작동 또는 아이디어?

업데이트 : 커널을 중간에 종료하지 않도록 설정을 변경했습니다. 도움이되지 않았습니다 :

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

'memory'에서 연결 이름을 변경해 보셨습니까? 예 :'default_connection : memory'를'default_connection : default' 또는 다른 이름으로 변경 하시겠습니까? 해당 예약어를 사용하면 (연결 데이터 자체의 속성이므로) 문제가 발생했을 수 있습니다. 조명기 파일을 게시하는 것도 가치가 있습니다. –

+0

@ 존 조셉 : 나는 그것을 시도했으나 아무런 효과가 없었다. 내 비품 파일은 상당히 커서, 그렇게하지 않을 것입니다. 또한, sqllte 파일에서 더 작동하기 때문에, 나는 나의 비품이 문제인지 의심 스럽다. –

+0

아직도 커널이 어떻게 든 종료/재부팅되는 것으로 생각합니다.어디에서, 당신은'print ("bootKernel() \ n"); 'symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Test/KernelTestCase.php'의'bootKernel()'함수의 맨 위에서'debug_print_backtrace();'를 실행 한 다음 영향을받은 테스트 케이스 중 하나를 실행하십시오. – aferber

답변

1

테스트 기능에서 createClient()으로 전화한다고 가정합니다. createClient()이하는 첫 번째 일은 static::bootKernel()입니다. 이는 기본적으로 메모리가 SQLite 데이터베이스 인 새로운 커널을 사용하여 setUp()에서 부팅 한 커널이 종료되고 새 커널이 부팅됨을 의미합니다.

당신은 bootKernel()을 대체하여 setUp()createClient() 전화를 이동할 수 있습니다,이 문제를 피하기 위해 :

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

좋은 점은 아직이 테스트는 이미 완료되었습니다.'''protected function setUp() { parent :: setUp(); $ this-> client = $ this-> makeClient(); ... "''' –

+0

아마도 테스트 기능 중 하나를 보여 주어야 할 것입니다. – aferber

0

때 요청 후

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

를 호출

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

커널은 기본적으로 종료되며, 메모리 내 데이터베이스가 휴지통입니다.

는 테스트의 설정() 함수에

client->disableReboot(); 

를 호출 할 경우,이 의지 동작을 사용할 수 없습니다, 당신은 전체 제품군을 실행할 수 있습니다.