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;
}
}
由于我正在开发包,所以我将我的工厂设置为这样的自定义路径:
-- 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;
}
}