【问题标题】:Laravel 5.2: Unable to locate factory with name [default]Laravel 5.2:无法找到具有名称的工厂 [默认]
【发布时间】: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)。

标签: php laravel laravel-5 laravel-5.2 laravel-seeding


【解决方案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 
    ];
});

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:
    1. 步骤 - 确保 CommentFactory 使用的是 Comment 而不是 Model。

      使用应用\评论 ...

      $factory->define(Comment::class, function (Faker $faker){
      
    2. 步骤 - 验证 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”中的第一个字母是大写的,所以请检查您的拼写,这可能是问题所在。

                【讨论】:

                  猜你喜欢
                  • 2018-02-14
                  • 2019-03-10
                  • 2019-10-05
                  • 2020-02-26
                  • 2019-03-19
                  • 2021-01-29
                  • 2017-03-13
                  • 1970-01-01
                  • 2019-05-26
                  相关资源
                  最近更新 更多