2014-02-19 2 views
10

테스트를 실행하기 전에 데이터베이스를 시드하려는 여러 테스트가있는 Laravel 4 테스트 클래스가 있습니다. setup() 함수를 사용하여 각 테스트를 다시 시드하는 데 시간이 오래 걸립니다. 그러나 정적 setupBeforeClass() 함수 또는 생성자에서 시드를 시도하면 분명히 $ this-> seed() 메서드를 사용할 수 없습니다.Laravel 4 단위 테스트의 setupBeforeClass 메소드에 데이터베이스를 어떻게 배치합니까?

그러나 어느 쪽도 내가 할 때 다음과 같은 오류를 얻을 수 있기 때문에, 프로그램 장인의 명령을 사용할 수 있습니다

Artisan::call('migrate:refresh'); 
Artisan::call('db:seed', array('--class'=>'TestSeeder'); 

주시기 바랍니다 : 여기에

PHP Fatal error: Class 'Artisan' not found in <test class name> 내가 씨앗을 사용하려는 코드가 나 차라리 테스트 경우

답변

17

이 같은 "즉흥적"하지만 setUp에서이 작업을 수행하는 것입니다 비슷한 효과를 달성하기 위해 꽤 깨끗한 이럴 방법하지만 한 번만 (setupBeforeClass가하는 것과 유사) 실행 한 것입니다 :

use Illuminate\Support\Facades\Artisan; 

class ExampleTest extends TestCase { 

    protected static $db_inited = false; 

    protected static function initDB() 
    { 
     echo "\n---initDB---\n"; // proof it only runs once per test TestCase class 
     Artisan::call('migrate'); 
     // ...more db init stuff, like seeding etc. 
    } 

    public function setUp() 
    { 
     parent::setUp(); 

     if (!static::$db_inited) { 
      static::$db_inited = true; 
      static::initDB(); 
     } 
    } 

    // ...tests go here... 
} 

... 이것은 내 솔루션이며 충분히 간단하고 잘 작동하여 모든 테스트를 실행하기 전에 db 구조를 시드 및 재구성하는 성능 문제를 해결합니다. 그러나 "올바른"방법은 테스트 방법을 사용하여 테스트 방법이 버그 숨기기 방식으로 미묘하게 상호 의존하지 않는다는 것을 확신 할 수 있습니다. 모든 테스트 방법 이전에 DB를 다시 시드하는 것입니다. 성능상의 불이익을 감당할 수 있다면 평범한 코드 setUp에 시드 코드를 넣으십시오. (필자의 테스트 케이스에서는 감당할 수 없지만 ymmv ...).

+0

이것은 완벽합니다. 감사합니다. –

+1

모든 테스트가 완료되면 어떻게 데이터베이스를 재설정합니까? –

+0

DatabaseTransaction 특성을 사용할 수 있으며 모든 테스트 방법을 수행하기 전에 db가 동일하게됩니다. – melihovv

4

저도 같은 문제가 있었 당보다 테스트 클래스에 한 번 내 데이터베이스를 시드하는 방법을 알고 번째로 해결

passthru('cd ' . __DIR__ . '/../.. & php artisan migrate:refresh & db:seed --class=TestSeeder'); 
+0

예를 발견! 당신은 내가 얼마나 자주이 같은 대답을 찾았는지 알고 있습니다! –

+0

이것은 일반적으로 테스트가 메모리에서 sqlite를 사용하기 때문에 완전히 작동하지 않습니다. – windmaomao

0

이 지금까지 가장 좋은 방법은 내가

class ExampleTest extends TestCase { 
/** 
* This method is called before 
* any test of TestCase class executed 
* @return void 
*/ 
public static function setUpBeforeClass() 
{ 
    parent::setUpBeforeClass(); 
    print "\nSETTING UP DATABASE\n"; 
    shell_exec('php artisan migrate --seed'); 
} 

/** 
* This method is called after 
* all tests of TestCase class executed 
* @return void 
*/ 
public static function tearDownAfterClass() 
{ 
    shell_exec('php artisan migrate:reset'); 
    print "\nDESTROYED DATABASE\n"; 
    parent::tearDownAfterClass(); 
} 
/** tests goes here **/ }