У меня есть пакет, содержащий каталог database/migrations
, внутри которого содержится ряд миграций. У меня есть каталог tests
который содержит один тест с одним утверждением.
Я хочу объединить тестовые миграции с помощью phpunit.
Я запускаю модуль PHP, и мой тест не выполняется:
$ phpunit
PHPUnit 4.6.6 by Sebastian Bergmann and contributors.
Configuration read from /var/www/.../phpunit.xml
F
Time: 594 ms, Memory: 15.25Mb
There was 1 failure:
1) MigrationTest::testTableExists
Failed asserting that false is true.
/var/www/../tests/MigrationTest.php:31
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
Эта команда не создает никаких таблиц в тестовой базе данных, она создает таблицу миграции в тестовой базе данных.
Затем я попытался выполнить миграцию в командной строке:
$ php artisan migrate --env=testing --path=/vendor/../database/migrations/
Migration table created successfully.
Migrated: 2015_.._table
Migrated: 2015_.._table
Migrated: 2015_.._table
--env=testing
полностью проигнорирован, и мои таблицы были перенесены в производственную базу данных (ПРИМЕЧАНИЕ: по производственной базе данных я имею в виду разработку, но параметры по умолчанию/производятся неправильно)
Я добавил учетные данные для разработки базы данных phpunit.xml
:
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_DATABASE" value="test"/>
<env name="DB_USERNAME" value="test"/>
<env name="DB_PASSWORD" value="test"/>
</php>
Мой тестовый файл:
<?php
class MigrationTest extends \Illuminate\Foundation\Testing\TestCase
{
public function createApplication()
{
$app = require __DIR__. '/../../../../bootstrap/app.php';
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
return $app;
}
public function setUp()
{
parent::setUp();
$this->artisan('migrate', ['--env' => 'testing', '--path' => __DIR__.'/../database/migrations']);
}
public function tearDown()
{
//$this->artisan('migrate:rollback', ['--path' => __DIR__.'/../']);
parent::tearDown();
}
public function testTableExists()
{
$hasTable = Schema::hasTable('table_name');
$this->assertTrue($hasTable);
}
}
Во время теста я могу использовать dd
для env()
данных env()
а учетные данные базы данных правильно настроены для test, test and test
.
Я действительно озадачен тем, как решить эту проблему.
Одной из проблем с этим было использование --path
поскольку миграция может мигрировать, и они не могут мигрировать вниз. Таким образом, наилучшей практикой является использование:
vendor:publish
ремесленника vendor:publish
и копировать в ./tests/
, или/vendor/<namespace>/<package>/tests/
в PHPUnit Я выбрал последнее, потому что это делает приложение более чистым и означает, что только пути пакетов должны поддерживаться вместе с любыми изменениями в composer.json
.
Таким образом, по сути, это случай добавления нескольких опций <directory>
внутри phpunit.xml.
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
<directory>./vendor/VENDOR/PACKAGE/tests/</directory>
</testsuite>
</testsuites>