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
  1. 步- 确保 CommentFactory 使用 Comment 而不是 Model。

    使用App\Comment ...

    $factory->define(Comment::class, function (Faker $faker){
    
  2. 步- 验证 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

在我的例子中,出现这个问题是因为我实际上并没有制作我试图调用的工厂 - 我一次制作了一堆模型,只是忘了创建那个工厂!