Laravel 5.2:无法找到具有名称的工厂 [默认]

Posted

技术标签:

【中文标题】Laravel 5.2:无法找到具有名称的工厂 [默认]【英文标题】:Laravel 5.2: Unable to locate factory with name [default] 【发布时间】:2016-07-25 02:16:12 【问题描述】:

我想播种数据库 当我使用这个

 public function run()

    $users = factory(app\User::class, 3)->create();

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

 public function run()

    $Comment= factory(app\Comment::class, 3)->create();

显示错误

[无效参数异常] 无法找到名称为 [default] [app\Comment] 的工厂。

【问题讨论】:

名称和命名空间是否正确?类真的存在吗? 不应该是App而不是app吗?此外,错误消息显示Commnet,所以如果你真的复制粘贴了上面的代码,那么错误来自其他地方。 对不起。我抄错了。我编辑我的帖子 你定义了模型工厂吗? 我的问题是我一直在使用App\Contact 而不是\App\Models\Contact(请注意,我需要在开头加上斜线,还需要\Models)。 【参考方案1】:

默认情况下,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 
    ];
);

【讨论】:

当您查看github.com/illuminate/database/blob/master/Eloquent/… 中的line 129 时,您会明白为什么@Angry Coder 是正确的。目前,您的 Comment 类没有定义。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

    使用应用\评论 ...

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

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

    使用应用\评论 ...

    公共函数运行() 工厂(评论::类,3)->创建();

祝你好运!

【讨论】:

我想指出,即使看起来很明显,文档中也没有说明使用 App\Comment,这让我觉得工厂创建是“神奇的”。那是我的问题,缺少使用。【参考方案4】:

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

我只是想添加这个,因为我在以后的版本中遇到了同样的问题,这个帖子帮我解决了很多问题。

【讨论】:

感谢您的帮助!我不知道为什么,但只有这样我的代码才能工作。【参考方案5】:

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

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

您应该将名称 Model 更改为您想要使用的名称,在我的例子中是 \App\InterviewQuestion,所以它变成:

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

【讨论】:

【参考方案6】:

如果对 PHPUnit 没有任何帮助。

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

【讨论】:

感谢您指出这一点,我找错地方了。 考虑到其他一切都是正确的,这可能为我节省了一整天的时间。 解决了我的问题。我认为没有必要调用父类,但显然它是必需的! 在我的所有测试扩展的本地 TestCase 类中定义了一个 __construct 方法后,我必须对其运行 parent::setUp() 以不覆盖默认行为。 这也是我的问题。我立即删除了setup() 方法,我的测试开始运行。【参考方案7】:

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

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

我在 Tinker 命令行中运行它:

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

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

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

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

对我来说,这会导致更多问题,因为它保存了我的配置文件,因此它们不会被 phpunit.xml 环境值覆盖【参考方案9】:

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

【讨论】:

【参考方案10】:

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

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


use Tests\TestCase;[正确]

【讨论】:

相同。使用php artisan make:test MyTest --unit 通过了示例测试。但确实在使用:use PHPUnit\Framework\TestCase; 谢谢! 这真是一个奇怪的行为 Laravel 在我的代码库中包含了它自己的抽象 TestCase 类,但它不打算在使用 make:test 生成测试时使用它。 PHPUnit\Framework\TestCase 应该用于 unit 测试,而 Laravel 的 Tests\TestCase 用于功能测试。单元测试必须单独测试代码。他们甚至不应该启动 Laravel 框架。这不是“错误的”,这个决定是正确的,而且是设计使然。真的,单元测试不应该访问数据库或单个类/方法之外的任何东西。 这拯救了我的一天。我选择将我的测试移至 Feature,因为 @hackel 的解释很有意义【参考方案11】:

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

【讨论】:

【参考方案12】:

以上答案都没有对我有用。 完全修复此错误的最佳方法是在 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');
  

【讨论】:

您使用的是orchestral/testbench,而不是标准的 Laravel 测试用例。该问题未提及此第三方软件包,因此您的答案不适用。此外,Testbench 有自己的方法可以为您执行此操作:$this-&gt;withFactories(__DIR__.'/factories');。 Laravel 的 TestCase 在功能测试中启动框架时会自动加载工厂。 @hackel 是真正的 mvp,如果你使用管弦乐队,这就是答案【参考方案13】:

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

扩展你的类

Tests\TestCase

而不是

PHPUnit\Framework\TestCase

【讨论】:

【参考方案14】:

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

【讨论】:

【参考方案15】:

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

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

代替

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

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

【讨论】:

以上是关于Laravel 5.2:无法找到具有名称的工厂 [默认]的主要内容,如果未能解决你的问题,请参考以下文章

无法找到 [Laravel\Passport\Client] 的工厂

在 laravel 5.2 中使用工厂关系违反完整性约束

在laravel 5.2中使用工厂关系违反完整性约束

检查具有特定id的用户是否已登录laravel 5.2

出现错误:InvalidArgumentException:无法找到名称为 [default] [App\User] 的工厂

未找到 Laravel 视图 5.2