2016-08-10 44 views
9

Bazı PHPUnit testlerinde Laravel'in Model Fabrikasını kullanmak istiyorum. Yapmak istediğim tek şey, bir Model örneğini veritabanına kaydetmeden yapmak.Laravel Model Fabrikası veritabanına bağlantı olmadan

Model Fabrikası neden veritabanına bağlı? Bu testler, yapılandırılmış veritabanı olmadan CI ortamından geçmelidir.

Model'i new App\Model($dataArray) ile manuel olarak oluşturduğumda, sınamalar başarılı olur ve bağlantı gerekli değildir.

Model Factory'yi başka yerlerde kullanıyorum, bu nedenle kod yinelemesinden kaçınmak için bu sınamalarda yeniden kullanmak istiyorum.

MongoDB ve jenssegers/laravel-mongodb kütüphanesini kullanıyorum, ama sanırım bir önemi yok - saf Eloquent ve ör. MySQL veritabanı, sorun aynı olurdu.

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

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

Benim Modeli Fabrikası

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

Testi veritabanı bağlantısı ihtiyacı:

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

Tam yığın takibi:

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 
veritabanı olmadan çalışır

Testi

+0

için

. Laravel, bellekte bir SQLite DB oluşturma seçeneği sunar. Yani teknik olarak bir veritabanına sahip ama kısa sürede testler bellekten kaldırılır DB tam olarak vb MongoDB veya MySQL doldurulmaz – user3425867

cevap

0

Bunun şu anda mümkün olduğunu düşünmüyorum. make() yöntemi, bir veritabanı bağlantısı kurmaya çalışan newModelInstance() yöntemini çağırır.

source code kendiniz inceleyebilirsiniz.

0

Normalde benzer bir test DB'si oluşturmayı ve bu DB'deki tüm testleri çalıştırmayı denerim.

Bu test DB tipi üretim ile aynı olmasını sağlar ve testleri çalıştırmak için üretim DB dokunmayın.

0

Eğer DatabaseTransactions kullanmayı deneyin musunuz? Örneğin

Bunun için SQLite kullanabilirsiniz
use Illuminate\Foundation\Testing\DatabaseTransactions; 
class ModelTransformerTest extends TestCase 
{ 
    use DatabaseTransactions; 
}