Невозможно найти фабрику с именем [default] [App \ Grade] в тестах PHPUnit, но работает в Tinker - PullRequest
0 голосов
/ 11 декабря 2019

Я только что начал новый проект 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-autoload и php 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>

Ответы [ 2 ]

1 голос
/ 21 декабря 2019

В модульных тестах используется 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 бежит до того, как Ларавел загрузится.

0 голосов
/ 11 декабря 2019

У меня была такая же проблема некоторое время назад и два предложения:

  1. Очистить все кэши
  2. run composer dumpautoload

В настоящее время у меня нетвозможность восстановить это, но, возможно, это поможет.

...