2016-08-10 58 views
9

我想在一些PHPUnit測試中使用Laravel的模型工廠。我想要做的唯一事情就是創建一個Model實例而不將它保存到數據庫中。Laravel模型工廠沒有連接到數據庫

爲什麼模型工廠需要連接數據庫?這些測試必須在沒有配置數據庫的CI環境中傳遞。

當我通過new App\Model($dataArray)手動創建模型時,測試通過並且不需要連接。

我在其他地方使用模型工廠,所以我想在該測試中重用它,以避免代碼重複。

我正在使用MongoDB和jenssegers/laravel-mongodb庫,但我猜測它沒有關係 - 在純粹的雄辯和例如MySQL數據庫的問題會是一樣的。

測試,沒有數據庫的工作原理:

class ModelTransformerTest extends TestCase 
{ 
    public function testTransformMinimalModelData() 
    { 
     $data = [ 
      '_id' => $faker->md5, 
      'email' => $faker->email, 
     ]; 

     $model = new App\Model($data); 
     // […]; 
    } 
} 

我的模型廠

$factory->defineAs(Model::class, 'base', function ($faker) { 
    return [ 
     '_id' => $faker->md5, 
     'email' => $faker->email, 
    ]; 
}); 

測試需要的數據庫連接:

class ModelTransformerTest extends TestCase 
{ 
    public function testTransformMinimalModelData() 
    { 
     $model = factory(App\Model::class, 'base')->make(); 
     // […]; 
    } 
} 

完整堆棧跟蹤:

Error: Class 'MongoDB\Driver\Manager' not found 

app\vendor\mongodb\mongodb\src\Client.php:56 
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\Connection.php:147 
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\Connection.php:37 
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\MongodbServiceProvider.php:27 
app\vendor\illuminate\database\DatabaseManager.php:173 
app\vendor\illuminate\database\DatabaseManager.php:68 
app\vendor\illuminate\database\Eloquent\Model.php:3282 
app\vendor\illuminate\database\Eloquent\Model.php:3248 
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\Eloquent\Model.php:523 
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\Eloquent\Model.php:284 
app\vendor\illuminate\database\Eloquent\Model.php:443 
app\vendor\illuminate\database\Eloquent\Model.php:281 
app\vendor\illuminate\database\Eloquent\FactoryBuilder.php:142 
app\vendor\illuminate\database\Eloquent\Model.php:2286 
app\vendor\illuminate\database\Eloquent\FactoryBuilder.php:143 
app\vendor\illuminate\database\Eloquent\FactoryBuilder.php:106 
app\tests\phpunit\Transformers\ModelTransformerTest.php:25 
\php\pear\PHPUnit\TextUI\Command.php:176 
\php\pear\PHPUnit\TextUI\Command.php:129 
+0

您可以使用SQLite這一點。 Laravel提供了一個在內存中創建SQLite數據庫的選項。所以你在技術上有一個數據庫,但它不會填充你的MongoDB或MySQL等。一旦測試完成,數據庫將從內存中刪除 – user3425867

回答

0

我不認爲這是現在可能的。 make()方法調用newModelInstance(),它嘗試設置數據庫連接。您可以自己查看source code

0

我通常會去創建一個類似的測試數據庫,並在該數據庫上運行所有測試。

它確保您的測試數據庫類型與生產相同,並且不會觸及生產數據庫以運行測試。

0

您是否試過使用DatabaseTransactions

例如

use Illuminate\Foundation\Testing\DatabaseTransactions; 
class ModelTransformerTest extends TestCase 
{ 
    use DatabaseTransactions; 
}