2016-08-10 10 views
9

PHPUnitテストでLaravelのModel Factoryを使用したいと思います。私がしたいのは、Modelインスタンスをデータベースに保存せずに作ることだけです。データベースに接続していないLaravel Model Factory

モデルファクトリがデータベースに接続する必要があるのはなぜですか?これらのテストは、構成されたデータベースなしでCI環境を通過する必要があります。

new App\Model($dataArray)でモデルを手動で作成すると、テストは合格し、接続は不要です。

私は他の場所でModel Factoryを使用していますので、コードの重複を避けるために、そのテストで再利用したいと思います。

私はMongoDBとjenssegers/laravel-mongodbライブラリを使用していますが、私はそれが問題ではないと推測しています。純粋なEloquentで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

については

。 LaravelはメモリにSQLite DBを作成するオプションを提供します。あなたは技術的にデータベースを持っていますが、あなたのMongoDBやMySQLなどを埋めることはありません。テストが完了すると、DBはメモリから削除されます – user3425867

答えて

0

これは現在可能ではないと思います。 make()メソッドは、データベース接続の設定を試みるnewModelInstance()を呼び出します。

あなた自身source codeを確認することができます。

0

私は通常、同様のテストDBを作成し、そのDB上のすべてのテストを実行します。

テストDBの種類が本番と同じで、テストを実行するために本番DBに触れないようにします。

0

お試しくださいデータベース取引?あなたは、このためのSQLiteを使用することができます例

use Illuminate\Foundation\Testing\DatabaseTransactions; 
class ModelTransformerTest extends TestCase 
{ 
    use DatabaseTransactions; 
} 
関連する問題