2015-08-27 13 views
11

Come posso utilizzare due database contemporaneamente nella codeception? La mia app PHP utilizza un database SQLite, ma si connette anche con un'altra app che utilizza un database MySQL.Utilizzo di due database contemporaneamente nella codeception

Al momento ho questo nel mio file codeception.yml:

modules: 
    config: 
    Db: 
     dsn: 'sqlite:db.sqlite' 
     dump: tests/_data/dump.sql 
     populate: true 
     cleanup: true 

In questo modo il database popola ogni volta con dati di test e si pulisce automaticamente al termine delle prove. Come posso aggiungere un database MySQL ora che fa lo stesso?

Inoltre, nel caso sia possibile, in alcuni test sto usando la funzione "seeInDatabase". Come dovrei specificare quale database deve apparire?

+0

Guardare il [file di origine] (https://github.com/Codeception/Codeception/blob/2.1/src/Codeception/Module/Db.php) mi fa pensare, non è possibile fuori dalla scatola . –

risposta

1

Possiamo effettivamente farlo abbastanza facilmente utilizzando le classi di estensione Codeception. Cosa faremo con le estensioni è la seguente:

Hook in "prima della prova" e "dopo la prova" gli eventi con la nostra estensione riconfigurare il modulo Db per puntare al nostro servizio web, ri-inizializzare il modulo e esegui Ripeti per ogni servizio Web Per iniziare, dobbiamo prima abilitare il modulo Db nei nostri test di accettazione. Seguire le istruzioni per l'installazione del modulo Db. Quello che è importante qui è che impostiamo populate e cleanup su false e che i dump puntano a un file valido. Impostiamo populate e cleanup su false perché non vogliamo che il modulo Db venga compilato e pulito dopo ogni test. Beh, tipo di fare, ma per impostazione predefinita il modulo Db comunica solo con un database in cui abbiamo bisogno di più.

In secondo luogo, seguire le istruzioni per creare un'estensione di Codeception di base. Dopo aver impostato la vostra classe, configurato e incluso nel vostro bootstrap, è possibile utilizzare il seguente codice come una guida:

class YourExtensionClass extends \Codeception\Platform\Extension { 

// events to listen on 
static $events = array(
'test.before' => 'beforeTest', 
'test.after' => 'afterTest', 
); 

function beforeTest(\CodeCeption\Event\Test $e) 
{ 
// get the test and groups 
$test = $e->getTest(); 
$groups = $test->getScenario()->getGroups(); 

// only restore if annotated to do so 
if (in_array('api', $groups)) { 
// get the Db module 
$db = $this->getModule('Db'); 

// re-initialize with web service one api config and execute 
$webserviceOneConfig = $this->getWebServiceOneConfig($this->config); 
$db->_reconfigure($webserviceOneConfig); 
$db->_initialize(); 
$db->_before($test); 

// re-initialize with web service two api config and execute 
$webserviceTwoConfig = $this->getWebServiceTwoConfig($this->config); 
$db->_reconfigure($webserviceTwoConfig); 
$db->_initialize(); 
$db->_before($test); 
} 
} 

function afterTest(\CodeCeption\Event\Test $e) 
{ 
// get the test and groups 
$test = $e->getTest(); 
$groups = $test->getScenario()->getGroups(); 

// only restore if annotated to do so 
if (in_array('api', $groups)) { 
// get the Db module 
$db = $this->getModule('Db'); 

// re-initialize with web service one api config and execute 
$webserviceOneConfig = $this->getWebServiceOneConfig($this->config); 
$db->_reconfigure($webserviceOneConfig); 
$db->_initialize(); 
$db->_after($test); 

// re-initialize with web service two api config and execute 
$webserviceTwoConfig = $this->getWebServiceTwoConfig($this->config); 
$db->_reconfigure($webserviceTwoConfig); 
$db->_initialize(); 
$db->_after($test); 
} 
} 

private function getWebServiceOneConfig($config) 
{ 
return array(
'dsn' => 'your first webservice db dsn', 
'dump' => '/path/to/your/first/dump/file', 
'populate' => true, 
'cleanup' => true, 
); 
} 

private function getWebServiceTwoConfig($config) 
{ 
return array(
'dsn' => 'your second webservice db dsn', 
'dump' => '/path/to/your/second/dump/file', 
'populate' => true, 
'cleanup' => true, 
); 
} 

Se abbia il mio setup estensione a sparare solo se un dato test è annotato correttamente, che è :

// in a Cest 
/** 
* @group api 
*/ 
public function hereIsSomeTest(WebGuy $I) 
{ 
... 
} 

// in a Cept 
$scenario->group('api'); 
$I = new WebGuy($scenario); 

I ha installato l'estensione di aderire alla annotazione "api" così non ho avuto da installare e abbattere le mie basi di dati API su ogni singolo test, solo quelli che si occupano di dati. Tuttavia, si potrebbe facilmente modificare in base alle proprie esigenze.

+0

Ho provato questa soluzione, ma non sono riuscito a capire come accedere a entrambi i database dal test. –