2014-04-25 3 views
2

시드 도구를 실행하는 단위 테스트가 있습니다. 내 클래스 중 하나의 새 인스턴스를 생성하도록 생성했습니다. Artisan에서 시더를 실행할 때 문제없이 실행됩니다. 그러나, 단위 테스트를 수행 할 때 :Laravel Schema :: Unit Test에서 실행할 때 테이블 접두사를 무시하여 만듭니다.

class MyClassTest extends TestCase { 
    public function setUp() { 
     // Setup application 
     parent::setUp(); 

     $this->seed('MyClassSeeder'); 
    } 

을 ... 실행됩니다 다음 비트는 접두사을 사용하기를 거부!

class MyClass extends Base { 
    // Switch to the proper DB prefix 
    protected function prefix() { 
     DB::connection('main')->setTablePrefix($this->id . '_'); 
     return $this; 
    } 

    // This is run by the seeder, everything up to here works fine... 
    public function setupDatabase() { 
     $this->prefix(); 

     // This returns "1001_", which is correct 
     Log::info(Schema::connection('main')->getConnection()->getTablePrefix()); 

     // Creates "myTable" instead of "1001_myTable" 
     if(!Schema::connection('main')->hasTable('myTable')) { 
      Schema::connection('main')->create('myTable', function($table) { 
      ... 

수동으로 실행하면 정상적으로 작동하므로 어디서부터 시작해야할지 모르겠습니다. 올바른 접두어를 반환하는 것조차 사용하지 않고 있습니다. 다른 사람이 본 적이 있습니까? 재현 가능합니까? 테스트 환경 (자동으로 단위 테스트에 사용됨)이 이미 다시 활성화 된 필터 이외의 기능을 사용합니까?

도움을 주시면 감사하겠습니다. 적어도 복제물은 우리 코드가 아니라고 말합니다. 우리는 꽤 많이 확장되었지만 설치시 Laravel 코드베이스에는 큰 변화가 없어야합니다.

추가 시험

그래서 나는 내 테스트를 계속하고, 나는 그것을 더 들여다거야하지만, 나는 경우 여기를 게시하도록하겠습니다 그것이 누구의 메모리를 조그, 버그로 보이는 발견 유사한 문제에 대한 :

나는 것으로

Log::info(Schema::connection('main')->getConnection()->getTablePrefix()); 

을 수정

Log::info('Grammar Prefix: ' . Schema::connection('promotion')->getConnection()->getSchemaGrammar()->getTablePrefix()); 
Log::info('Connection Prefix: ' . Schema::connection('promotion')->getConnection()->getTablePrefix()); 
,

그리고 Connection Prefix 행은 이전과 같이 올바르게 작동하지만 문법의 Prefix는 존재하지 않습니다. 문법 및 연결 접두사가 일치하지 않습니다.이 문제를 해결할 수 있지만 단위 테스트 클래스가 아닌 다른 방식으로 실행하면 일관성이 유지되는 이유를 알고 싶습니다. 그러나 여기에는 불일치가 있습니다. 다른 사람에게 그렇게 보이는 경우 곧 버그로보고됩니다.

최종 테스트 나는 그것이 청사진 및 스키마를 모두 업데이트 된 접두사를 사용해야합니다 다음 데이터베이스 설정 파일, 그리고에서, 코드가 초기 설정을 얻어야한다 무엇을 말할 수에서

때 라인

DB::connection('promotion')->setTablePrefix($this->id . '_'); 

이 실행됩니다. 나는 또한 그 라인을 달려서 주위를 돌아 다녔다.

DB::connection('promotion')->getSchemaGrammar()->setTablePrefix($this->id . '_'); 

어느 것이 문제를 해결하는 것으로 보인다. 이것은 필요하지 않아야하며, 내가 사용하고있는 코드가 원하는 효과를 가져서는 안된다. 이 버그를 고려 중이며 오늘 나중에보고 할 것입니다. 내가 뭔가를 놓친 경우에 대비하여 질문을 공개적으로 남겨 두겠다.하지만 곧 끝낼 것이다.

+1

왜 'promotion'연결에 대해 테이블 ​​접두어를 설정하고 있는데 Schema에서 'main'연결을 사용하고 있습니까? –

+0

실수로, 그들은 모두 내 코드에서 동일합니다. 단순함을 위해 이름이 변경되었습니다. – ahamilton9

+0

$ this-> id는 어디에 지정되어 있습니까? 어떻게 설정 되나요? –

답변

1

나는이 버그가 결론에 도달했습니다. 테스트가 기본 환경과 다른 것을하지 않는 한 어떤 환경에서는 작동하지만 다른 환경에서는 작동하지 않는 이유에 대한 설명이 없으며 찾을 수 없습니다.

0

PHPUnit은 Laravel이 데이터베이스와 상호 작용하는 방식을 변경하지 않습니다. 테스트를 실행할 때 구성을 덮어 쓰지 않도록하십시오. environment configuration

또한 동일한 연결을 설정하고 사용하고 있는지 확인하십시오.제공 한 코드에서 연결 promotion의 접두어를 설정하고 있는데 아직 연결을 사용하고 있습니다 main 다음은 작동하는 예제입니다. 나는 당신과 비슷한 것으로 만들려고했습니다.

TestSeedTest.php

<?php 

class TestSeedTest extends TestCase{ 

    public function setUp() { 
     // Setup application 
     parent::setUp(); 


    } 

    public function testSeeder(){ 

     $this->seed('MyClassSeeder'); 

    } 

} 
?> 

MyClassSeeder.php는

<?php 

class MyClassSeeder extends Seeder { 

    private $id='123'; 

    /** 
    * Run the database seeds. 
    * 
    * @return void 
    */ 
    public function run() 
    { 
     $this->setupDatabase(); 

    } 

    protected function prefix() { 

     DB::connection('promotion')->setTablePrefix($this->id . '_'); 

     return $this; 
    } 


    // This is run by the seeder, everything up to here works fine... 
    public function setupDatabase() { 
     $this->prefix(); 


     if(!Schema::connection('promotion')->hasTable('myTable')) { 
      Schema::connection('promotion')->create('myTable', function($table) { 

       $table->increments('id'); 
       $table->string('test'); 
       $table->timestamps(); 
      }); 
     } 

    } 

} 
+0

여기에 코드를 포팅했을 때 이름이 잘못되었습니다. 나는 단순화를 위해 사물의 이름을 바꾸었다. 환경은 다른 연결을 가지고 있지만, 내가 말했듯이 Artisan에서 마이그레이션을 실행할 수 있습니다 (--env = testing을 사용하면 내가 언급 한 것 같지 않습니다). param은 잘 작동합니다. 내 코드도 올바른 접두사를 확인하기 전에 접두사를 확인하는 로그를 가지고 있지만, 분명히 hasTable 함수가 삭제됩니다. – ahamilton9

관련 문제