Artisan «Ничего не переносить» ошибка с PHPUnit

1

конспект

У меня есть пакет, содержащий каталог database/migrations, внутри которого содержится ряд миграций. У меня есть каталог tests который содержит один тест с одним утверждением.

Я хочу объединить тестовые миграции с помощью .

Возникающие проблемы

Я запускаю модуль 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.

Я действительно озадачен тем, как решить эту проблему.

  • 0
    Я столкнулся с этой же проблемой и пришел к выводу, что runDatabaseMigration () запускается после завершения метода (методов) setUp (). Я пока не смог придумать изящное решение, кроме как извлечь его из пользовательского метода установки и вызывать его из каждого теста.
Теги:
unit-testing
laravel-5
phpunit
artisan

1 ответ

0
Лучший ответ

Одной из проблем с этим было использование --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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню