InvalidArgumentException:无法找到名称为 [default] 的工厂 - laravel、faker、phpunit

InvalidArgumentException: Unable to locate factory with name [default] - laravel, faker, phpunit

由于我正在开发包,所以我将我的工厂设置为这样的自定义路径:

-- app

-- packages

-----mockizart

-------blog

---------database

--------------factories

----------------- PageModelFactory.php

---------src

这是我在我的服务提供商中加载工厂的方式(我已经通过在 phpstorm 上单击它来确保路径是正确的):

function boot()
{
 Factory::construct($this->app->make(\Faker\Generator::class), __DIR__."/../database/factories");
}

这是我的页面模型工厂(我已经确定这个文件真的被加载了):

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */
use Mockizart\Blog\Dodols\PageModel;
use Faker\Generator as Faker;


$factory->define(PageModel::class, function (Faker $faker) {
    return [
        'name' => "retretre",
        'slug' => "retretret",
        'type' => 0,
        'category' => 0,
        'tags' => "",
        'content' => "",
    ];
});

这是我的脚本测试:

use Mockizart\Blog\Dodols\PageModel;
    .....
    .....
/** @test */
public function edit_page()
{
   dd(PageModel::find(1)); <-- this return was NULL so I think my class and namespace does exist.

   factory(PageModel::class)->make(); <-- this cause error "unable to locate factory......"
   $response = $this->get('/blog/page/edit/15');
   $response->assertStatus(200);
}

所以如果您使用 orchestra\Testbench,加载自定义工厂的正确方法是在您的测试 class 或 TestCase NOT[= 的 setUp() 方法中19=] 在你的 Service Provider.

代码应该是这样的:

class TestCase extends \Orchestra\Testbench\TestCase
{
   public function setUp(): void
   {
     parent::setUp();
     // additional setup
     $this->loadMigrationsFrom(__DIR__ . '/../database/migrations');
     $this->withFactories(__DIR__.'/../database/factories');
   }

   protected function getPackageProviders($app)
   {
       return BlogServiceProvider::class;
   }
}