2017-04-18 88 views
7

Farklı veritabanı bağlantılarını işaret eden modelleri olan bir Laravel 5.4 uygulamasına sahibim. ÖrneğinLaravel 5: Birden çok bağlantıyı taşıyın ve test edin

, MySQL veritabanına User işaret ve daha sonra Company ($connection değişken kullanarak) bir PostgreSQL'i işaret edilmektedir.

PHPUnit'i çalıştırdığımda, $connection değişkeninin, veritabanı türünde bir SQLite olan phpunit.xml dosyasında belirtilenler ile değiştirilmesini istiyorum.

Bu nasıl elde edilebilir? senin .env dosyasında PHPUnit içinde

MY_CONNECTION=mysql 

yılında

public function __construct(array $attributes = []) 
{ 
    $this->connection = env('MY_CONNECTION'); 
    parent::__construct($attributes); 
} 

: Eğer modelinde .env dosyası

bağlantı adlarını hareket olabilir kafamın üst Kapalı

+0

Neden verilen cevap sorunun için iyi değil? – mimo

cevap

3

.xml

<env name="MY_CONNECTION" value="sqlite"/> 
+1

Tüm bağlantı dizelerini '.env' dosyasına taşımanız gerekmez. "MY_CONNECTION" ifadesinin mevcut olup olmadığını daha iyi kontrol edin. Eğer varsa, bağlantı değişkeninin üzerine yazabilirsiniz. – mimo

0
<php> 
    <env name="APP_ENV" value="testing"/> 
    <env name="DB_CONNECTION" value="sqlite"/> 
    <env name="DB_DATABASE" value="testDatabase"/> 
<php> 
: phpunit.xml Bu değişkenleri ( DB_DATABASE isteğe bağlıdır) ihtiyacınızı yılında

public function __construct(array $attributes = []) 
{ 
    if(App::environment() == 'testing') { 
     $this->connection = env('DB_CONNECTION'); 
    } 
    parent::__construct($attributes); 
} 

:gibi Arturo Rojas bağlantı değişkeni üzerine zorundadır eğer, yapıcı kontrol etmek zorunda onun cevabını yazdı

laravel sonra yerine üretim kodu dokunmayın ve bunun yerine teste özel hizmetler oluşturmak için hizmet kabını kullanmayı tercih ediyorum /config/database.php

0

gelen SQLLite bağlantıyı kullanır. tüm modeller aynı varsayılan test bağlantısı kullanmak istiyorsanız bu durumda

:

public function createApplication() 
{ 
    $app = require __DIR__.'/../bootstrap/app.php'; 

    $app->make(Kernel::class)->bootstrap(); 

    $fakeManager = new class ($app, $app['db.factory']) extends DatabaseManager { 
     public function connection($name = null) { 
      return parent::connection($this->getDefaultConnection()); 
     } 
    }; 
    $app->instance('db', $fakeManager); 
    Model::setConnectionResolver($fakeManager); 

    return $app; 
} 

(Bu CreatesApplication özelliğini geçersiz kılar, bunun yerine uygulama bootstrapped ve zaman arasında herhangi bir yere bu kodu yerleştirebilirsiniz olabilir taşıma komutu çağrıldığında).

(Ayrıca, bu, PHP 7 satır içi anonim sınıfları kullanıyor. Ayrıca, ayrı bir sınıf olarak bir sahte db yöneticisi tanımlayabilirsiniz).

0

Daha önce de belirtildiği gibi, önce her Modelde bağlantıyı ayarlamanız gerekir. Yani, veritabanı yapılandırma dosyasındaki bağlantıları kurar, .env dosyasındaki değerleri ayarlayın ve bunları Modelin yapıcılarında kullanın.

Test için bunu da yapabilirsiniz. Test bağlantısını config/database.php dosyasına ekleyin ve ardından bir geçersiz kılma env dosyası kullanın.

Ek bir env dosyası oluşturun, ona .env.testing gibi bir ad verin.

Yani, .env dosyada size sahip olacaktır:

CONNECTION_MYSQL=mysql 
CONNECTION_POSTGRESS=postgress 

Sonra .env.testing dosyasında sahip olabilir: Test, CreatesApplication özelliği giderken

CONNECTION_MYSQL=test_sqlite 
CONNECTION_POSTGRESS=test_sqlite 

Nihayet bu env dosyasını yüklemek için ve aşağıdakiler için güncelleştirin:

loadEnvironemtFrom() yöntemini kullanarak, bu özelliği kullanan tüm sınamalar .env.testing dosyasını yükleyecek ve orada tanımlanan bağlantıları kullanacaktır.