Laravel 5.2:无法找到名称为 [default] 的工厂
Laravel 5.2: Unable to locate factory with name [default]
我要种子数据库
当我使用这个
public function run()
{
$users = factory(app\User::class, 3)->create();
}
在数据库中添加三个用户,但是当我使用这个时
public function run()
{
$Comment= factory(app\Comment::class, 3)->create();
}
显示错误
[InvalidArgumentException]
Unable to locate factory with name [default] [app\Comment].
默认情况下,laravel 安装在 database/factories/ModelFactory.php
文件中附带此代码。
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});
因此您需要先定义一个工厂模型,然后再使用它来为数据库做种。
这仅使用 Faker Library 的一个实例,该实例用于生成假数据以播种数据库以执行测试。
确保您已经为评论模型添加了一个类似的模态工厂。
所以您的 Comments Model Factory 将是这样的:
$factory->define(App\Comment::class, function (Faker\Generator $faker) {
return [
'comment' => $faker->sentence,
// Any other Fields in your Comments Model
];
});
当您是 运行 来自 php artisan tinker
的命令 factory()->create()
时,也会发生这种情况。确保在打开 tinker
之前保存文件 database/factories/ModelFactory.php
步-
确保 CommentFactory 使用 Comment 而不是 Model。
使用App\Comment
...
$factory->define(Comment::class, function (Faker $faker){
步-
验证 CommentsTableSeeder 中的名称是否正确。
使用App\Comment
...
public 函数 运行()
{
工厂(评论::class, 3)->创建();
}
祝你好运!
我正在使用 laravel 5.5 并且这样做有点不同。您必须在 \database\factories 目录中创建 CommentFactory.php 并将其添加到其中,
$factory->define(App\Comment::class, function (Faker\Generator $faker) {
return [
'comment' => $faker->sentence,
// Any other Fields in your Comments Model
];
});
并添加这个,
$Comment= factory(\App\Comment::class, 3)->create();
而不是
$Comment= factory(app\Comment::class, 3)->create();
我只是想添加这个,因为我在更高版本中遇到了同样的问题,这个线程帮助我解决了这个问题。
我正在使用 Laravel Framework 5.7.19
。在我的例子中,我的工厂文件是从命令行 make:factory
生成的。文件中的默认模型是:
$factory->define(Model::class, ...
您应该将名称 Model
更改为您真正想要使用的名称,在我的例子中是 \App\InterviewQuestion
,因此它变成:
$factory->define(\App\InterviewQuestion::class, ...
如果对PHPUnit没有任何帮助。
对于那些在测试中遇到同样问题的读者,我发现我忘记在 setUp
方法中添加 parent::setUp()
。
我试图从 tinker 测试模型工厂。我已经按照上面的线程和其他 Laravel 文档中的说明创建了模型工厂。但它不会 运行 并抛出一个带有消息
的 InvalidArgumentException
Unable to locate factory with name [default] [/App/Game]
我在 Tinker 命令行中 运行将其设置为:
factory('\App\Game')->create();
一段时间后,我发现问题出在前导反斜杠 \
。我 运行 它像下面这样并且工作正常。:
factory('App\Game')->create();
愚蠢的东西,但可能对某人有所帮助。
这可能是缓存问题。您可以通过以下命令解决它。
php artisan clear-compiled
composer dump-autoload
php artisan optimize
在我的例子中,错误是我导入了错误的测试基础 class。我没有扩展 Laravel 的 Tests\TestCase,而是从 PHPUnit 导入了 TestCase class。愚蠢的,但我花了很长时间才弄明白。
有时可能是因为导入了错误的TestCase
use PHPUnit\Framework\TestCase;
[错误: 并引发此错误]
use Tests\TestCase;
[正确]
none 个答案对我有用
所以我删除了我的工厂并重新创建它(每一个都与以前的工厂相同)并且这个问题为我解决了
None 以上答案对我有用。
完全修复此错误的最佳方法是在 TestCase class 中注册您的工厂,如下所示:
<?php
namespace Vendo\Package\Tests;
use Vendor\Package\InboxServiceProvider;
use Illuminate\Database\Eloquent\Factory as EloquentFactory;
class TestCase extends \Orchestra\Testbench\TestCase
{
public function setUp(): void
{
parent::setUp();
// additional setup
$this->app->make(EloquentFactory::class)->load(__DIR__ . '/../database/factories');
}
如果您在使用单元测试时遇到此问题,这可能会解决您的问题。
用
扩展你的class
Tests\TestCase
而不是
PHPUnit\Framework\TestCase
我遇到了同样的问题。尝试了一切。没有任何效果。然后我退出 Tinker 并再次启动它,它成功了!
就我而言,出现问题是因为我正在使用
factory('App\schedule')->create();
而不是
factory('App\Schedule')->create();
“Schedule”的首字母大写,请检查拼写,可能是问题所在。
注意 Laravel 8+ 需要记住的几点:
1。
替换
使用PHPUnit\Framework\TestCase;
有
使用Tests\TestCase;
2。
添加
使用刷新数据库;
使用WithFaker;
在你的测试中class。
3。
在 Laravel 测试中使用工厂的新方法是:
Post::factory()->create();
有关更多详细信息,请参阅随附的屏幕:
PostFactory
Post Model
PostController
posts view
post test file
web routes for posts
在我的例子中,出现这个问题是因为我实际上并没有制作我试图调用的工厂 - 我一次制作了一堆模型,只是忘了创建那个工厂!
我要种子数据库 当我使用这个
public function run()
{
$users = factory(app\User::class, 3)->create();
}
在数据库中添加三个用户,但是当我使用这个时
public function run()
{
$Comment= factory(app\Comment::class, 3)->create();
}
显示错误
[InvalidArgumentException]
Unable to locate factory with name [default] [app\Comment].
默认情况下,laravel 安装在 database/factories/ModelFactory.php
文件中附带此代码。
$factory->define(App\User::class, function (Faker\Generator $faker) {
return [
'name' => $faker->name,
'email' => $faker->email,
'password' => bcrypt(str_random(10)),
'remember_token' => str_random(10),
];
});
因此您需要先定义一个工厂模型,然后再使用它来为数据库做种。 这仅使用 Faker Library 的一个实例,该实例用于生成假数据以播种数据库以执行测试。
确保您已经为评论模型添加了一个类似的模态工厂。
所以您的 Comments Model Factory 将是这样的:
$factory->define(App\Comment::class, function (Faker\Generator $faker) {
return [
'comment' => $faker->sentence,
// Any other Fields in your Comments Model
];
});
当您是 运行 来自 php artisan tinker
的命令 factory()->create()
时,也会发生这种情况。确保在打开 tinker
database/factories/ModelFactory.php
步- 确保 CommentFactory 使用 Comment 而不是 Model。
使用App\Comment ...
$factory->define(Comment::class, function (Faker $faker){
步- 验证 CommentsTableSeeder 中的名称是否正确。
使用App\Comment ...
public 函数 运行() { 工厂(评论::class, 3)->创建(); }
祝你好运!
我正在使用 laravel 5.5 并且这样做有点不同。您必须在 \database\factories 目录中创建 CommentFactory.php 并将其添加到其中,
$factory->define(App\Comment::class, function (Faker\Generator $faker) {
return [
'comment' => $faker->sentence,
// Any other Fields in your Comments Model
];
});
并添加这个,
$Comment= factory(\App\Comment::class, 3)->create();
而不是
$Comment= factory(app\Comment::class, 3)->create();
我只是想添加这个,因为我在更高版本中遇到了同样的问题,这个线程帮助我解决了这个问题。
我正在使用 Laravel Framework 5.7.19
。在我的例子中,我的工厂文件是从命令行 make:factory
生成的。文件中的默认模型是:
$factory->define(Model::class, ...
您应该将名称 Model
更改为您真正想要使用的名称,在我的例子中是 \App\InterviewQuestion
,因此它变成:
$factory->define(\App\InterviewQuestion::class, ...
如果对PHPUnit没有任何帮助。
对于那些在测试中遇到同样问题的读者,我发现我忘记在 setUp
方法中添加 parent::setUp()
。
我试图从 tinker 测试模型工厂。我已经按照上面的线程和其他 Laravel 文档中的说明创建了模型工厂。但它不会 运行 并抛出一个带有消息
的InvalidArgumentException
Unable to locate factory with name [default] [/App/Game]
我在 Tinker 命令行中 运行将其设置为:
factory('\App\Game')->create();
一段时间后,我发现问题出在前导反斜杠 \
。我 运行 它像下面这样并且工作正常。:
factory('App\Game')->create();
愚蠢的东西,但可能对某人有所帮助。
这可能是缓存问题。您可以通过以下命令解决它。
php artisan clear-compiled
composer dump-autoload
php artisan optimize
在我的例子中,错误是我导入了错误的测试基础 class。我没有扩展 Laravel 的 Tests\TestCase,而是从 PHPUnit 导入了 TestCase class。愚蠢的,但我花了很长时间才弄明白。
有时可能是因为导入了错误的TestCase
use PHPUnit\Framework\TestCase;
[错误: 并引发此错误]
use Tests\TestCase;
[正确]
none 个答案对我有用 所以我删除了我的工厂并重新创建它(每一个都与以前的工厂相同)并且这个问题为我解决了
None 以上答案对我有用。 完全修复此错误的最佳方法是在 TestCase class 中注册您的工厂,如下所示:
<?php
namespace Vendo\Package\Tests;
use Vendor\Package\InboxServiceProvider;
use Illuminate\Database\Eloquent\Factory as EloquentFactory;
class TestCase extends \Orchestra\Testbench\TestCase
{
public function setUp(): void
{
parent::setUp();
// additional setup
$this->app->make(EloquentFactory::class)->load(__DIR__ . '/../database/factories');
}
如果您在使用单元测试时遇到此问题,这可能会解决您的问题。 用
扩展你的class
Tests\TestCase
而不是
PHPUnit\Framework\TestCase
我遇到了同样的问题。尝试了一切。没有任何效果。然后我退出 Tinker 并再次启动它,它成功了!
就我而言,出现问题是因为我正在使用
factory('App\schedule')->create();
而不是
factory('App\Schedule')->create();
“Schedule”的首字母大写,请检查拼写,可能是问题所在。
注意 Laravel 8+ 需要记住的几点:
1。 替换
使用PHPUnit\Framework\TestCase;
有
使用Tests\TestCase;
2。 添加
使用刷新数据库;
使用WithFaker;
在你的测试中class。
3。 在 Laravel 测试中使用工厂的新方法是:
Post::factory()->create();
有关更多详细信息,请参阅随附的屏幕:
PostFactory
Post Model
PostController
posts view
post test file
web routes for posts
在我的例子中,出现这个问题是因为我实际上并没有制作我试图调用的工厂 - 我一次制作了一堆模型,只是忘了创建那个工厂!