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->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] 的工厂
出现错误:InvalidArgumentException:无法找到名称为 [default] [App\User] 的工厂