我将框架Laravel与软件包modularization结合使用。
我创建了一个模块并对其进行了一些测试。但是,我无法使用覆盖范围(./vendor/bin/phpunit --coverage-text --colors=never
)运行测试。没有覆盖标志,测试将正确运行(./vendor/bin/phpunit
)。
这里是执行的两个命令:
在我所有的测试中,有一个我打电话给工厂的测试
class InstitutionControllerTest extends TestCase
{
/**
* @testdox Get the data of institutions
* @covers \Modules\Institution\Http\Controllers\InstitutionController::index
* */
public function testIndex():void
{
$institution = factory(Institution::class)->make();
$institutionCollection = new Collection($institution);
$mock = Mockery::mock(InstitutionRepository::class);
$mock->shouldReceive('all')->andReturn($institutionCollection);
$this->app->instance(InstitutionRepository::class, $mock);
$response = $this->json('GET', 'api/institutions');
$this->assertEquals(Response::HTTP_OK, $response->status());
$this->assertEquals($institutionCollection, $response->getContent());
}
}
我按照documentation中的说明将工厂添加到了提供中,但是它不能解决错误。
class InstitutionServiceProvider extends ServiceProvider
{
public function boot()
{
...
$this->registerFactories();
...
}
public function register()
{
$this->app->register(RouteServiceProvider::class);
$this->app->singleton(Factory::class, function () {
$faker = $this->app->make(\Faker\Generator::class);
return Factory::construct($faker, __DIR__ . '/../Database/factories');
});
}
...
public function registerFactories()
{
if (! app()->environment('production') && $this->app->runningInConsole()) {
app(Factory::class)->load(__DIR__ . '/../Database/factories');
}
}
....
}
您知道如何解决此错误吗?
phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit/</directory>
<directory suffix="Test.php">./Modules/**/Tests/Unit/</directory>
</testsuite>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature/</directory>
<directory suffix="Test.php">./Modules/**/Tests/Feature</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./app</directory>
<directory suffix=".php">./Modules</directory>
<exclude>
<directory suffix="blade.php">./Modules</directory>
<directory suffix=".php">./Modules/**/Routes</directory>
<directory suffix=".php">./Modules/**/Resources</directory>
<directory suffix=".php">./Modules/**/Tests</directory>
<directory suffix=".php">./Modules/**/Config</directory>
</exclude>
</whitelist>
</filter>
<php>
<server name="APP_ENV" value="testing"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<server name="MAIL_DRIVER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
</php>
</phpunit>
我的工厂班
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use Faker\Generator as Faker;
use Modules\Institution\Entities\Institution;
// the variable $factory is Undefined
$factory->define(Institution::class, function (Faker $faker) {
return [
'name' => $faker->company
];
});
您是否已在计算机上安装Xdebug?
要生成代码覆盖率,PHP单元还不够,需要Xdebug
将这些标志添加到测试CLI运行命令中
--strict-coverage
--verbose
--stop-on-defect
--stop-on-error
--stop-on-failure
--stop-on-warning
有关available flags的更多信息
在测试源中执行对factory
前面没有美元符号的搜索。
您也可以通过使用这些标志来缩小生成此警告的范围
--group
或
--filter
有选择地运行测试,看看哪种测试方法准确地产生了此警告。
对于组,只需在所有测试方法中标注@group one
,@group two
等,并使用该标志运行test
--group one
运行具有批注@group one
的测试方法。