53

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

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

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

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

显示错误

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

4

15 回答 15

99

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

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


use Tests\TestCase;[正确的]

于 2020-01-21T08:34:06.147 回答
87

如果对PHPUnit没有任何帮助。

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

于 2019-02-07T10:36:28.757 回答
48

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

确保您已为 Comments 模型添加了类似的 Modal Factory。

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

$factory->define(App\Comment::class, function (Faker\Generator $faker) {
    return [
        'comment' => $faker->sentence,
         // Any other Fields in your Comments Model 
    ];
});
于 2016-04-05T09:30:35.147 回答
18

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

于 2017-05-17T00:50:45.103 回答
14

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

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

于 2018-03-22T08:24:20.587 回答
12
  1. 步骤 - 确保 CommentFactory 使用的是 Comment 而不是 Model。

    使用应用\评论...

    $factory->define(Comment::class, function (Faker $faker){
    
  2. 步骤 - 验证 CommentsTableSeeder 中的名称是否正确。

    使用应用\评论...

    public function run() { factory(Comment::class, 3)->create(); }

祝你好运!

于 2018-02-01T12:46:04.260 回答
12

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

Tests\TestCase

代替

PHPUnit\Framework\TestCase

于 2020-06-20T23:45:31.697 回答
5

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

于 2019-12-23T13:07:48.510 回答
4

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

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

您应该将名称更改为Model您确切想要使用的东西,在我的情况下它是\App\InterviewQuestion,所以它变成:

$factory->define(\App\InterviewQuestion::class, ...
于 2018-12-25T03:09:58.813 回答
3

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

php artisan clear-compiled
composer dump-autoload
php artisan optimize
于 2019-06-02T06:23:05.450 回答
3

上面的答案都没有对我有用。完全修复此错误的最佳方法是在 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');
  }
于 2020-03-10T08:41:39.833 回答
2

我试图从tinker测试 Model Factory 。我已经按照上面的线程和其他 Laravel 文档中的说明创建了模型工厂。但它不会运行并抛出一个InvalidArgumentException带有消息

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

我在 Tinker 命令行中运行它:

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

一段时间后,我发现问题出在前导反斜杠\上。我像下面一样运行它,它运行良好。:

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

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

于 2019-03-17T12:50:30.060 回答
0

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

于 2020-02-16T12:26:08.157 回答
0

我有同样的问题。什么都试过了。没有任何效果。然后我退出 Tinker 并再次启动它,它工作了!

于 2020-11-24T23:20:58.320 回答
0

就我而言,问题出现是因为我使用

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

代替

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

“Schedule”中的第一个字母是大写的,所以请检查你的拼写,这可能是问题所在。

于 2021-11-22T11:32:45.387 回答