2015-08-27 16 views
11

Jak korzystać z dwóch baz danych jednocześnie w trybie kodowania? Moja aplikacja PHP używa bazy danych SQLite, ale także łączy się z inną aplikacją korzystającą z bazy danych MySQL.Używanie dwóch baz danych w tym samym czasie w kodekulacji

W tej chwili mam to w moim pliku codeception.yml:

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

ten sposób baza danych zapełnia za każdym razem z danymi testowymi i czyści się automatycznie po zakończeniu testów. Jak mogę dodać bazę danych MySQL teraz, tak samo?

Również w przypadku niektórych testów korzystam z funkcji "seeInDatazy". Jak określić, która baza danych ma wyglądać?

+0

Patrząc na [plik źródłowy] (https://github.com/Codeception/Codeception/blob/2.1/src/Codeception/Module/Db.php) myślę, że nie jest to możliwe po wyjęciu z pudełka . –

Odpowiedz

1

Możemy to osiągnąć dość łatwo przy użyciu klas rozszerzających kodeki. Co będziemy robić z rozszerzeniami, to:

Dołącz do wydarzeń "przed testem" i "po teście" z naszym rozszerzeniem Ponownie skonfiguruj moduł Db tak, aby wskazywał na nasz serwis internetowy, ponownie zainicjuj moduł i Wykonaj Powtórz dla każdej usługi internetowej Aby rozpocząć, musimy najpierw włączyć moduł Db w naszych testach akceptacyjnych. Postępuj zgodnie z instrukcjami, aby skonfigurować moduł Db. Ważne jest to, że ustawiliśmy wypełnianie i czyszczenie na false, a to zrzutu wskazuje na poprawny plik. Ustawiamy populację i czyścimy na false, ponieważ nie chcemy, aby moduł Db był wypełniany i czyszczony po każdym teście. Cóż, robimy, ale domyślnie moduł Db komunikuje się tylko z jedną bazą danych, w której potrzebujemy wielu.

Po drugie, postępuj zgodnie z instrukcjami tworzenia podstawowego rozszerzenia Codecepcji. Po skonfigurowaniu klasa, skonfigurowany i włączyła ją w bootstrap, można użyć poniższy kod jako przewodnik:

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, 
); 
} 

Jeśli mam setup rozszerzenie do jedynego ognia czy dany test jest prawidłowo odnotowany, co jest :

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

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

mogę skonfigurować rozszerzenie do przestrzegania „API” adnotacji więc nie miałem do konfiguracji i zburzyć moich baz danych API na każdym teście, tylko te, które dotyczą danych. Można jednak bardzo łatwo modyfikować w zależności od potrzeb.

+0

Próbowałem tego rozwiązania, ale nie mogłem dowiedzieć się, jak uzyskać dostęp do obu baz danych z testu. –