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