当我用标志覆盖率运行Phpunit时,出现错误:Undefined variable factory

问题描述 投票:0回答:2

我将框架Laravel与软件包modularization结合使用。

我创建了一个模块并对其进行了一些测试。但是,我无法使用覆盖范围(./vendor/bin/phpunit --coverage-text --colors=never)运行测试。没有覆盖标志,测试将正确运行(./vendor/bin/phpunit)。

这里是执行的两个命令:

enter image description here

在我所有的测试中,有一个我打电话给工厂的测试

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
    ];
});
php laravel laravel-5 phpunit laravel-6
2个回答
0
投票

您是否已在计算机上安装Xdebug?

要生成代码覆盖率,PHP单元还不够,需要Xdebug


0
投票

将这些标志添加到测试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的测试方法。

© www.soinside.com 2019 - 2024. All rights reserved.