2017-02-20 98 views
2

Laravel的documentation建議使用DatabaseMigrations特徵來在測試之間遷移和回滾數據庫。如何爲laravel測試種子數據庫遷移?

use Illuminate\Foundation\Testing\DatabaseMigrations; 

class ExampleTest extends TestCase 
{ 
    use DatabaseMigrations; 

    /** 
    * A basic functional test example. 
    * 
    * @return void 
    */ 
    public function testBasicExample() 
    { 
     $response = $this->get('/'); 

     // ... 
    } 
} 

但是,我有一些我想用於測試的種子數據。如果我運行:

php artisan migrate --seed 

然後它適用於第一個測試,但它失敗後續測試。這是因爲特徵回滾了遷移,並且當它再次運行遷移時,它不會爲數據庫創建種子。我如何在遷移中運行數據庫種子?

回答

11

我花了一些時間來解決這個問題,所以I thought I'd share

如果你看一下在DatabaseMigrations trait的源代碼,然後你會看到它有一個功能runDatabaseMigrations多數民衆贊成由setUpruns before every test調用並註冊要在拆解運行的回調。

您可以通過別名該函數來排序"extend" the trait,在原名稱下用您的邏輯重新聲明一個新函數(artisan db:seed),並在其中調用別名。

use Illuminate\Foundation\Testing\DatabaseMigrations; 

class ExampleTest extends TestCase 
{ 
    use DatabaseMigrations { 
     runDatabaseMigrations as baseRunDatabaseMigrations; 
    } 

    /** 
    * Define hooks to migrate the database before and after each test. 
    * 
    * @return void 
    */ 
    public function runDatabaseMigrations() 
    { 
     $this->baseRunDatabaseMigrations(); 
     $this->artisan('db:seed'); 
    } 

    /** 
    * A basic functional test example. 
    * 
    * @return void 
    */ 
    public function testBasicExample() 
    { 
     $response = $this->get('/'); 

     // ... 
    } 
} 
+3

這應該是測試文檔中!播種是測試中非常重要的一部分,我沒有看到任何提及。如我錯了請糾正我。 –

+0

很棒的答案。這裏是任何人想知道如何創建播種機的文檔的快捷方式:https://laravel.com/docs/5.6/seeding –

0

下面是一個替代的解決方案,如果你喜歡繞過Artisan的天然DatabaseMigrations和播種機/遷移方法。你可以創建自己的特質種子數據庫:

namespace App\Traits; 

use App\Models\User; 
use App\Models\UserType; 

trait DatabaseSetup 
{ 

    public function seedDatabase() 
    { 
     $user = $this->createUser(); 
    } 

    public function createUser() 
    { 
     return factory(User::class)->create([ 
      'user_type_id' => function() { 
       return factory(UserType::class)->create()->id; 
      } 
     ]); 
    } 

    public function getVar() { 
     return 'My Data'; 
    } 
} 

然後把它在您的測試是這樣的:

use App\Traits\DatabaseSetup; 

class MyAwesomeTest extends TestCase 
{ 
    use DatabaseSetup; 
    use DatabaseTransactions; 

    protected $reusableVar; 

    public function setUp() 
    { 
     parent::setUp(); 
     $this->seedDatabase(); 
     $this->reusableVar = $this->getVar(); 
    } 

    /** 
    * @test 
    */ 
    public function test_if_it_is_working() 
    { 
     $anotherUser = $this->createUser(); 
     $response = $this->get('/'); 
     $this->seeStatusCode(200); 
    } 

}