Php Laravel 5.2:无法找到名为[默认值]的工厂

Php Laravel 5.2:无法找到名为[默认值]的工厂,php,laravel,laravel-5,laravel-5.2,laravel-seeding,Php,Laravel,Laravel 5,Laravel 5.2,Laravel Seeding,我想建立一个数据库 当我用这个的时候 public function run() { $users = factory(app\User::class, 3)->create(); } 在数据库中添加三个用户,但当我使用此 public function run() { $Comment= factory(app\Comment::class, 3)->create(); } 告诉我错误 [InvalidArgumentException] 无法找到名为[默认

我想建立一个数据库 当我用这个的时候

 public function run()
{
    $users = factory(app\User::class, 3)->create();
}
在数据库中添加三个用户,但当我使用此

 public function run()
{
    $Comment= factory(app\Comment::class, 3)->create();
}
告诉我错误

[InvalidArgumentException]
无法找到名为[默认值][app\Comment]的工厂


默认情况下,laravel安装在
数据库/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),
    ];
});
所以,在使用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之前,确保保存文件
数据库/factories/ModelFactory.php

  • 台阶- 确保CommentFactory使用的是注释而不是模型

    使用App\Comment

  • 台阶- 验证CommentsTableSeeder中的名称是否正确

    使用App\Comment

    公共功能运行() { 工厂(Comment::class,3)->create(); }


  • 祝你好运

    我使用的是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

    无法找到名为[默认应用程序/游戏]的工厂

    我在Tinker命令行中运行它,如下所示:

    factory('\App\Game')->create();
    
    过了一段时间,我发现问题在于前面的反斜杠
    \
    。我像下面那样运行它,它运行得很好

    factory('App\Game')->create();
    

    愚蠢的事情,但可能会帮助某人。

    这可能是缓存问题。您可以通过执行以下命令来解决此问题

    php artisan clear-compiled
    composer dump-autoload
    php artisan optimize
    

    在我的例子中,错误是我导入了错误的测试基类。我没有扩展Laravel的Tests\TestCase,而是从PHPUnit导入了TestCase类。很傻,但我花了很长时间才弄明白这一点。

    有时可能是因为导入了错误的测试用例
    使用PHPUnit\Framework\TestCase[错误:并引发此错误]



    使用测试\TestCase[正确]

    没有一个答案对我有用
    因此,我删除了我的工厂并再次创建它(每一个工厂都与以前的工厂相同),这个问题为我解决了

    上面的答案都不适用于我。 完全修复此错误的最佳方法是在TestCase类中注册工厂,如下所示:

    <?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');
      }
    

    如果您在使用单元测试时遇到此问题,这可能会解决您的问题。
    使用

    Tests\TestCase

    而不是


    PHPUnit\Framework\TestCase



    我也有同样的问题。什么都试过了。什么都没用。然后我退出Tinker并再次启动它,它成功了

    名称和名称空间是否正确?类真的存在吗?不应该是
    App
    而不是
    App
    ?此外,错误信息显示
    Commnet
    ,因此如果您真的复制粘贴了上述代码,则错误来自其他地方。对不起。我抄错了。我编辑了我的帖子你定义了模型工厂了吗?我的问题是我一直在使用
    App\Contact
    而不是
    \App\Models\Contact
    (注意,我在开头需要一个斜杠,还有
    \Models
    )。当你查看中的
    第129行时,你就会明白为什么@angle Coder是正确的。目前你的评论课还没有定义。谢谢你的帮助!我不知道为什么,但我的代码就是这样工作的。我想指出的是,即使看起来很明显,文档中也没有说明使用App\Comment,这让我觉得工厂的创建是“神奇的”。那是我的问题,那是我没有用的地方。谢谢你指出,我找错了地方。考虑到其他一切都是对的,可能省了我一整天的时间。解决了我的问题。我认为没有必要调用父类,但显然这是必需的!在我的本地TestCase类中定义了一个_构造方法(我的所有测试都扩展了该方法)之后,我必须对其运行parent::setUp(),以避免覆盖默认行为。这也是我的案例中的问题。我立即删除
    setup()
    方法,我的测试开始运行。使用
    php artisan make:test MyTest--unit
    通过了示例测试。但实际上是在使用:
    使用PHPUnit\Framework\TestCase谢谢!这确实是一种奇怪的行为,Laravel在我的代码库中包含了自己的抽象
    TestCase
    类,但当它使用
    make:test
    PHPUnit\Framework\TestCase
    生成测试时不打算使用它,而Laravel的
    tests\TestCase
    用于单元测试。单元测试必须单独测试代码。他们甚至不应该启动Laravel框架
    <?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');
      }