2016-08-10 4 views
9

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 
+0

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

Antwort

0

Ich glaube nicht, dass dies derzeit möglich ist. Die Methode make() ruft newModelInstance() auf, die versucht, eine Datenbankverbindung einzurichten.

Sie können die source code selbst überprüfen.

0

Ich gehe normalerweise für die Erstellung einer ähnlichen Test DB und führen Sie alle Tests auf dieser DB.

Es stellt sicher, dass Ihr Test-DB-Typ der Produktion entspricht und Sie nicht die Produktions-DB zum Ausführen der Tests berühren.

0

Versuchen Sie es mit DatabaseTransactions?

Zum Beispiel

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