Настройка интеграционных тестов в пакете laravel

В настоящее время пытаются настроить интеграционные тесты в пакете, который я пишу.

Для тестов интеграции мне понадобится доступ к среде Laravel, чтобы я мог получить доступ к таким вещам, как Artisan :: call (‘migrate’) и получить доступ к базе данных.

В настоящее время я предполагаю, что мне нужно, чтобы какие-либо тесты расширяли класс Laravel TestCase, загружая среду Laravel. Хотя я не могу понять, как я могу вызвать этот файл в свой пакет.

Во-вторых, при разработке пакетов в рабочей среде мне нужно было бы использовать Artisan :: call (‘migrate’, ‘—bench = «vendor / package»‘) или Artisan :: call (‘migrate’, ‘—package = «vendor /) пакет «‘) это сбивает с толку.

3

Решение

Нам нужно создать экземпляр 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' был объявлен устаревшим Теперь разработчики должны создавать свои собственные команды для генерации и перемещения файлов миграции в нужное место в приложении. Это гораздо более гибкий подход.

9

Другие решения

Хотя на этот вопрос уже есть принятый ответ, я настоятельно рекомендую использовать оркестр / испытательный стенд пакет.

Добавить этот пакет в require-dev раздел вашего пакета composer.json и не забудьте расширить любой тестовый класс из этого пакета TestCase как описано в README.

Этот пакет может загружать настраиваемых поставщиков услуг, регистрировать настраиваемые псевдонимы и т. Д., Одновременно раскручивая полную среду Laravel для тестирования.

7

По вопросам рекламы [email protected]