Artisan 'Nothing to migrate' PHPUnit 错误
Artisan 'Nothing to migrate' error with PHPUnit
剧情简介
我有一个包含 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.
此命令不会在测试数据库中创建任何 table,它会在测试数据库中创建迁移 table。
然后我尝试 运行 命令行上的迁移:
$ php artisan migrate --env=testing --path=/vendor/../database/migrations/
Migration table created successfully.
Migrated: 2015_.._table
Migrated: 2015_.._table
Migrated: 2015_.._table
--env=testing
参数已被完全忽略,我的 table 已迁移到生产数据库(注意:生产数据库是指开发,但 default/production 设置使用不当)
我将开发数据库凭据添加到 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()
数据,并且数据库凭据正确设置为 test, test and test
。
我真的很困惑如何解决这个问题。
其中一个问题是使用 --path
因为迁移只能向上迁移而不能向下迁移。因此,最佳做法是使用:
- Artisan
vendor:publish
并复制到 ./tests/
或
- 将
/vendor/<namespace>/<package>/tests/
目录添加到 PHPUnit
我选择了后者,因为这样可以使应用程序更干净,并且意味着只需要维护包路径以及对 composer.json
.
的任何更改
所以本质上是在 phpunit.xml.
中添加多个 <directory>
定义的情况
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
<directory>./vendor/VENDOR/PACKAGE/tests/</directory>
</testsuite>
</testsuites>
剧情简介
我有一个包含 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.
此命令不会在测试数据库中创建任何 table,它会在测试数据库中创建迁移 table。
然后我尝试 运行 命令行上的迁移:
$ php artisan migrate --env=testing --path=/vendor/../database/migrations/
Migration table created successfully.
Migrated: 2015_.._table
Migrated: 2015_.._table
Migrated: 2015_.._table
--env=testing
参数已被完全忽略,我的 table 已迁移到生产数据库(注意:生产数据库是指开发,但 default/production 设置使用不当)
我将开发数据库凭据添加到 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()
数据,并且数据库凭据正确设置为 test, test and test
。
我真的很困惑如何解决这个问题。
其中一个问题是使用 --path
因为迁移只能向上迁移而不能向下迁移。因此,最佳做法是使用:
- Artisan
vendor:publish
并复制到./tests/
或 - 将
/vendor/<namespace>/<package>/tests/
目录添加到 PHPUnit
我选择了后者,因为这样可以使应用程序更干净,并且意味着只需要维护包路径以及对 composer.json
.
所以本质上是在 phpunit.xml.
中添加多个<directory>
定义的情况
<testsuites>
<testsuite name="Application Test Suite">
<directory>./tests/</directory>
<directory>./vendor/VENDOR/PACKAGE/tests/</directory>
</testsuite>
</testsuites>