Laravel 5.2:无法找到名称为[factory]的工厂

时间:2016-04-05 08:42:44

标签: 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]
  无法找到名称为[默认] [app \ Comment]的工厂。

14 个答案:

答案 0 :(得分:86)

有时可能是由于导入了错误的 TestCase

use PHPUnit\Framework\TestCase; [错误:并抛出此错误]


use Tests\TestCase; [正确]

答案 1 :(得分:32)

默认情况下,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的实例,该实例用于生成假数据,用于播种数据库以执行测试。

确保您为评论模型添加了类似的模态工厂。

所以你的评论模型工厂将是这样的:

$factory->define(App\Comment::class, function (Faker\Generator $faker) {
    return [
        'comment' => $faker->sentence,
         // Any other Fields in your Comments Model 
    ];
});

答案 2 :(得分:14)

当您从factory()->create()运行命令php artisan tinker时,也会发生这种情况。确保在打开修补程序之前保存文件database/factories/ModelFactory.php

答案 3 :(得分:10)

如果 PHPUnit 没有帮助。

对于那些在测试中遇到相同问题的读者,我发现我忘记在parent::setUp()方法中添加setUp

答案 4 :(得分:7)

步骤1º步骤 - 确保CommentFactory使用的是Comment而不是Model。

use App\Comment
...

    $factory->define(Comment::class, function (Faker $faker){

2º步 - 验证CommentsTableSeeder中的名称是否正确。

use App\Comment
...

public function run()
{
  factory(Comment::class, 3)->create();
}
祝你好运!

答案 5 :(得分:7)

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

扩展您的课程

Tests\TestCase

代替

PHPUnit\Framework\TestCase

答案 6 :(得分:6)

我正在使用 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();

我只是想添加这个,因为我在以后的版本面临同样的问题,这个线程帮助我解决了很多问题。

答案 7 :(得分:2)

以上所有答案均对我没有帮助。 完全解决此错误的最佳方法是通过在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');
  }

答案 8 :(得分:1)

我正在使用Laravel Framework 5.7.19。就我而言,我的工厂文件是从命令行make:factory生成的。文件中的默认模型为:

$factory->define(Model::class, ...

您应该将名称Model更改为您确实要使用的名称,在我的情况下为\App\InterviewQuestion,因此它变为:

$factory->define(\App\InterviewQuestion::class, ...

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

我正尝试从修补匠测试Model Factory。我已经按照上述线程和其他Laravel文档中的说明创建了模型工厂。但是它不会运行并向消息中抛出InvalidArgumentException

  

无法找到名称为[default] [/ App / Game]的工厂

我在Tinker命令行中将其运行为:

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

一段时间后,我发现问题出在反斜杠\前面。我像下面那样运行它,效果很好。

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

傻事,但可能会帮助别人。

答案 11 :(得分:0)

在我的情况下,错误是我导入了错误的测试基类。我没有扩展Laravel的Tests \ TestCase,而是从PHPUnit导入了TestCase类。傻了,但花了我不少时间才能解决。

答案 12 :(得分:0)

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

答案 13 :(得分:0)

我有同样的问题。尝试了一切。没事。然后我退出了Tinker,然后再次启动它,就可以了!