Ich möchte Laravels Model Factory in einigen PHPUnit-Tests verwenden. Das einzige, was ich tun möchte, ist, eine Model-Instanz zu erstellen, ohne sie in der Datenbank zu speichern.Laravel Model Factory ohne Verbindung zur Datenbank
Warum benötigt die Modellfabrik eine Verbindung zur Datenbank? Diese Tests müssen die CI-Umgebung ohne konfigurierte Datenbank weitergeben.
Wenn ich das Modell manuell durch erstelle, werden Tests bestanden und die Verbindung wird nicht benötigt.
Ich benutze Model Factory an anderen Orten, also möchte ich es in diesen Tests wiederverwenden, um Code-Duplizierung zu vermeiden.
Ich verwende MongoDB und jenssegers/laravel-mongodb Bibliothek, aber ich vermute, dass es keine Rolle hat - in reinen eloquent und z. MySQL-Datenbank, das Problem wäre das gleiche.
-Test, die ohne Datenbank funktioniert:
class ModelTransformerTest extends TestCase
{
public function testTransformMinimalModelData()
{
$data = [
'_id' => $faker->md5,
'email' => $faker->email,
];
$model = new App\Model($data);
// […];
}
}
My Model Fabrik
$factory->defineAs(Model::class, 'base', function ($faker) {
return [
'_id' => $faker->md5,
'email' => $faker->email,
];
});
-Test, die Datenbankverbindung benötigt:
class ModelTransformerTest extends TestCase
{
public function testTransformMinimalModelData()
{
$model = factory(App\Model::class, 'base')->make();
// […];
}
}
Voll Stack-Trace:
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
Sie SQLite für diese verwenden können. Laravel bietet eine Option zum Erstellen einer SQLite-DB im Arbeitsspeicher. Sie haben also technisch eine Datenbank, aber Ihre MongoDB oder MySQL usw. wird nicht gefüllt. Sobald die Tests abgeschlossen sind, wird die DB aus dem Speicher entfernt – user3425867