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

par*_*oid 31 php laravel laravel-5 laravel-seeding laravel-5.2

我想在使用它时播种数据库

 public function run()
{
    $users = factory(app\User::class, 3)->create();
}
Run Code Online (Sandbox Code Playgroud)

在数据库中添加三个用户,但是当我使用它时

 public function run()
{
    $Comment= factory(app\Comment::class, 3)->create();
}
Run Code Online (Sandbox Code Playgroud)

告诉我错误

[InvalidArgumentException]
无法找到名称为[default] [app\Comment]的工厂.

Aye*_*Ope 97

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

use PHPUnit\Framework\TestCase;[错误:并引发此错误]


use Tests\TestCase; [正确的]

  • `PHPUnit\Framework\TestCase` 应该用于**单元**测试,而 Laravel 的 `Tests\TestCase` 用于功能测试。单元测试必须单独测试代码。他们甚至不应该启动 Laravel 框架。这不是“错误”,这个决定是正确的并且是有意为之的。单元测试永远不应该访问数据库或单个类/方法之外的任何内容。 (10认同)
  • 这确实是一个奇怪的行为,Laravel 在我的代码库中包含了自己的抽象“TestCase”类,但在使用“make:test”生成测试时并不打算使用它。 (5认同)
  • 相同的。使用 php artisan make:test MyTest --unit 通过了示例测试。但确实使用:`use PHPUnit\Framework\TestCase;` 谢谢! (4认同)

Dar*_*yev 38

如果没有帮助的PHPUnit

对于那些谁坚持在测试同一个问题的读者,我发现我忘了补充parent::setUp()setUp方法。

  • 感谢您指出这一点,我一直在寻找所有错误的地方。 (4认同)
  • 考虑到其他一切都正确,可能挽救了我整整一天的时间。 (2认同)

Moh*_*han 37

默认情况下,laravel安装在database/factories/ModelFactory.phpFile中附带此代码.

$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),
    ];
});
Run Code Online (Sandbox Code Playgroud)

因此,在使用工厂模型对种子数据库进行种子设定之前,需要先定义它.这只是使用Faker Library的一个实例,它用于生成假数据,用于播种数据库以执行测试.

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

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

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

  • 当你看看https://github.com/illuminate/database/blob/master/Eloquent/FactoryBuilder.php中的"129行"时,你就会明白为什么@Angry Coder是对的.目前,您的评论课没有定义. (2认同)

Agu*_*ndo 16

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


M.a*_*man 12

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

Tests\TestCase

代替

PHPUnit\Framework\TestCase


vim*_*uth 9

我正在使用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 
    ];
});
Run Code Online (Sandbox Code Playgroud)

并添加这个,

$Comment= factory(\App\Comment::class, 3)->create();
Run Code Online (Sandbox Code Playgroud)

代替

$Comment= factory(app\Comment::class, 3)->create();
Run Code Online (Sandbox Code Playgroud)

我只是想添加这个,因为我面临着更高版本的相同问题,这个线程帮助我解决了很多问题.

  • 谢谢你的帮助!我不知道为什么,但是只有这样我的代码才能正常工作。 (2认同)

小智 7

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

use App\Comment
...

    $factory->define(Comment::class, function (Faker $faker){
Run Code Online (Sandbox Code Playgroud)

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

use App\Comment
...

public function run()
{
  factory(Comment::class, 3)->create();
}
Run Code Online (Sandbox Code Playgroud)

祝好运!


小智 5

就我而言,错误是我导入了错误的测试基类。我没有扩展 Laravel 的 Tests\TestCase,而是从 PHPUnit 导入了 TestCase 类。愚蠢,但我花了很长时间才弄清楚这一点。