Использование sqlite :memory: в тестах Yii

Довольно часто для тестов используется субд sqlite с опцией :memory:, которая указывает что базу нужно держать в памяти, а не сохранять на диск. Благодаря этому все операции с бд выполняются очень быстро и тесты проходят гораздо быстрее.

Для этого в конфиге для тестового окружения указываем подключение к бд:

'db' => array(  
    'connectionString' => 'sqlite::memory:',
),

Теперь возникает главная проблема - так как база каждый раз запускается с нуля на неё нужно накатить миграции, а это уже не так просто как хотелось бы. Миграции в Yii написаны таким образом что код который за него отвечает захардкожен в консольной утилите, что затрудняет его использование в bootstrap-файле тестов.

Тем не менее, эту проблему можно решить добавив вот такой код в bootstrap.php:

Yii::createConsoleApplication($config);  
Yii::app()->commandRunner->addCommands(YII_PATH . '/cli/commands');  
Yii::app()->commandRunner->run(['', 'migrate', '--interactive=0']);  

Как не трудно понять, мы просто эмулируем запуск консольной команды заставив ее накатить миграции на текущиее соединение указанное в тестовом конфиге.