【问题标题】:Unable to locate factory with name [default] [App\Grade] in PHPUnit tests but working in Tinker无法在 PHPUnit 测试中找到名称为 [default] [App\Grade] 的工厂,但在 Tinker 中工作
【发布时间】:2020-04-05 00:12:25
【问题描述】:

我刚刚开始了一个新的 Laravel 项目并创建了一个模型工厂:

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */

use App\Model;
use Faker\Generator as Faker;

$factory->define(\App\Grade::class, function (Faker $faker) {
    return [
        'grade_number' => 1,
        'valid_from' => \Carbon\Carbon::now(),
    ];
});

对于以下型号:

<?php

namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;

class Grade extends Model
{
    /**
     * Scope a query to select the latest date entry for each grade
     *
     * @param $query
     *
     * @return mixed
     */
    public function scopeCurrent($query)
    {
        // This selects the latest set of grades from the table with a current start date

        return $query->where('valid_from', '<', Carbon::now())->orderByDesc('valid_from');
    }
}

当我从php artisan tinker 调用它时,模型被创建:

>>> $grade = factory(\App\Grade::class)->make();
=> App\Grade {#3057
     grade_number: 1,
     valid_from: Carbon\Carbon @1576082185 {#3050
       date: 2019-12-11 16:36:25.169212 UTC (+00:00),
     },
   }

但是当我从我的测试中调用它时:

<?php

    namespace Tests\Unit;

    use App\Grade;
    use Illuminate\Foundation\Testing\RefreshDatabase;
    use PHPUnit\Framework\TestCase;

    class GradeTest extends TestCase
    {

        use RefreshDatabase;

        /** @test */
        public function it_knows_its_latest_grades()
        {
            $grade = factory(Grade::class)->make();
        }
    }

我收到以下错误:

InvalidArgumentException : Unable to locate factory with name [default] [App\Grade].

这是一个全新的 Laravel 6 安装,所以我想不出为什么会这样。我已经尝试过运行composer dump-autoloadphp artisan cache:clear,但没有成功。

我的PHPUnit.xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
         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>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <server name="APP_ENV" value="testing"/>
        <server name="BCRYPT_ROUNDS" value="4"/>
        <server name="CACHE_DRIVER" value="array"/>
        <server name="DB_CONNECTION" value="sqlite"/>
        <server name="DB_DATABASE" value=":memory:"/>
        <server name="MAIL_DRIVER" value="array"/>
        <server name="QUEUE_CONNECTION" value="sync"/>
        <server name="SESSION_DRIVER" value="array"/>
    </php>
</phpunit>

【问题讨论】:

  • 尝试运行 composer dump autoload
  • 已经试过了,不过还是谢谢。
  • 如果这不起作用,我会认为您的文件位于与命名空间和文件名不对应的错误目录或文件名中。
  • 模型文件在 Laravel 的/app 目录下。另外,该命令在 Tinker 中有效。

标签: php laravel phpunit factory


【解决方案1】:

前段时间我也遇到过同样的问题,有两个建议:

  1. 清除所有缓存
  2. 运行composer dumpautoload

目前我没有选择重建它,但也许这会有所帮助。

【讨论】:

  • 感谢您的建议,但这似乎不起作用。为了澄清,我打电话给composer dump-autoloadphp artisan config:clearphp artisan cache:clear
【解决方案2】:

单元测试使用use PHPUnit\Framework\TestCase;

但功能测试使用use Tests\TestCase;

<?php

    namespace Tests\Unit;

    use App\Grade;
    use Illuminate\Foundation\Testing\RefreshDatabase;
    use PHPUnit\Framework\TestCase;

    class GradeTest extends TestCase
    {

        use RefreshDatabase;

        /** @test */
        public function it_knows_its_latest_grades()
        {
            $grade = factory(Grade::class)->make();
        }
    }

功能测试在 Laravel 启动后运行。我相信PHPUnit\Framework\TestCase 在 Laravel 启动之前运行。

【讨论】:

猜你喜欢
  • 2017-03-13
  • 2019-05-26
  • 2020-02-26
  • 2017-09-20
  • 2019-03-19
  • 2017-04-20
  • 2016-04-06
  • 1970-01-01
  • 2019-07-26
相关资源
最近更新 更多