В настоящее время пытаются настроить интеграционные тесты в пакете, который я пишу.
Для тестов интеграции мне понадобится доступ к среде Laravel, чтобы я мог получить доступ к таким вещам, как Artisan :: call (‘migrate’) и получить доступ к базе данных.
В настоящее время я предполагаю, что мне нужно, чтобы какие-либо тесты расширяли класс Laravel TestCase, загружая среду Laravel. Хотя я не могу понять, как я могу вызвать этот файл в свой пакет.
Во-вторых, при разработке пакетов в рабочей среде мне нужно было бы использовать Artisan :: call (‘migrate’, ‘—bench = «vendor / package»‘) или Artisan :: call (‘migrate’, ‘—package = «vendor /) пакет «‘) это сбивает с толку.
Нам нужно создать экземпляр Laravel вместе с базой данных, к которой PHPUnit может получить доступ для запуска тестов с реальными наборами данных. Не хрупкие издевательства. Во-первых, вы должны разрабатывать свои пакеты изолированно по ряду причин, одна из которых — верстак, теперь не рекомендуется в Laravel 5.
Итак, во-первых, нам нужно dev-require
рамки Laravel в наш проект:
"require-dev": {
"phpunit/phpunit": "~4.0",
"phpspec/phpspec": "~2.1",
"laracasts/testdummy": "~2.0",
"laravel/laravel": "dev-develop"},
Теперь мы можем создать абстрактный класс DbTestCase
что все наши тесты будут расширяться с. В этом классе мы будем раскручивать экземпляр Laravel и в памяти База данных SQLite для скорости.
Если мы расширим родной тестовый класс Laravel Illuminate\Foundation\Testing\TestCase
часть работы для нас уже проделана. Нам просто нужно создать метод, который возвращает экземпляр Illuminate\Foundation\Application
,
/**
* Boots the application.
*
* @return \Illuminate\Foundation\Application
*/
public function createApplication()
{
$app = require __DIR__.'/../vendor/laravel/laravel/bootstrap/app.php';
$app->register('Path\To\Your\PackageServiceProvider');
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
return $app;
}
обратите внимание на линию $app->register('Path\To\Your\PackageServiceProvider');
это важно. Укажите здесь путь к поставщику услуг пакетов, чтобы мы зарегистрировали его в нашем экземпляре Laravel, который находится в наших пакетах. /vendor
папка.
Теперь у нас запущено приложение Laravel, нам нужно настроить базу данных SQLite в памяти. Простой, Ларавелла TestCase
имеет setUp()
функция, которая запускается раньше, чем когда-либо, давайте сделаем это там:
/**
* Setup DB before each test.
*
* @return void
*/
public function setUp()
{
parent::setUp();
$this->app['config']->set('database.default','sqlite');
$this->app['config']->set('database.connections.sqlite.database', ':memory:');
$this->migrate();
}
Я не буду давать много объяснений, поскольку это вполне читабельно. Как вы можете видеть в последней строке, мы также звоним $this->migrate()
который, очевидно, запускает наши миграции каждый раз, когда мы запускаем тест, давая нам новую базу данных для тестирования. Давайте посмотрим, как это работает:
/**
* run package database migrations
*
* @return void
*/
public function migrate()
{
$fileSystem = new Filesystem;
$classFinder = new ClassFinder;
foreach($fileSystem->files(__DIR__ . "/../src/Migrations") as $file)
{
$fileSystem->requireOnce($file);
$migrationClass = $classFinder->findClass($file);
(new $migrationClass)->up();
}
}
Чтобы не вдаваться в подробности, в основном то, что мы здесь делаем, это изучение src/Migrations
папка пакета, требующая все файлы и затем запускающая их миграции. Это грубо и нуждается в большем количестве проверок безопасности (я сделаю это в будущем), но это работает.
Почему не Artisan :: call (‘мигрировать’) ??
Просто! В Laravel 5 команда php artisan migrate --package='vendor/package'
был объявлен устаревшим Теперь разработчики должны создавать свои собственные команды для генерации и перемещения файлов миграции в нужное место в приложении. Это гораздо более гибкий подход.
Хотя на этот вопрос уже есть принятый ответ, я настоятельно рекомендую использовать оркестр / испытательный стенд пакет.
Добавить этот пакет в require-dev
раздел вашего пакета composer.json
и не забудьте расширить любой тестовый класс из этого пакета TestCase
как описано в README.
Этот пакет может загружать настраиваемых поставщиков услуг, регистрировать настраиваемые псевдонимы и т. Д., Одновременно раскручивая полную среду Laravel для тестирования.