Php Laravel 5.2:无法找到名为[默认值]的工厂
我想建立一个数据库 当我用这个的时候Php Laravel 5.2:无法找到名为[默认值]的工厂,php,laravel,laravel-5,laravel-5.2,laravel-seeding,Php,Laravel,Laravel 5,Laravel 5.2,Laravel Seeding,我想建立一个数据库 当我用这个的时候 public function run() { $users = factory(app\User::class, 3)->create(); } 在数据库中添加三个用户,但当我使用此 public function run() { $Comment= factory(app\Comment::class, 3)->create(); } 告诉我错误 [InvalidArgumentException] 无法找到名为[默认
public function run()
{
$users = factory(app\User::class, 3)->create();
}
在数据库中添加三个用户,但当我使用此
public function run()
{
$Comment= factory(app\Comment::class, 3)->create();
}
告诉我错误
[InvalidArgumentException]无法找到名为[默认值][app\Comment]的工厂
默认情况下,laravel安装在
数据库/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),
];
});
所以,在使用factory模型为数据库种子之前,需要先定义它。
这只是使用了一个实例,该实例用于生成虚假数据,用于为数据库播种以执行测试
确保为注释模型添加了类似的模态工厂
因此,您对模型工厂的评论如下:
$factory->define(App\Comment::class, function (Faker\Generator $faker) {
return [
'comment' => $faker->sentence,
// Any other Fields in your Comments Model
];
});
当您从
php artisan tinker
运行命令factory()->create()
时,也会发生这种情况。在打开tinker之前,确保保存文件数据库/factories/ModelFactory.php
祝你好运 我使用的是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();
我只是想添加这个,因为我在以后的版本中面临同样的问题,这个线程帮助我解决了很多问题。我使用的是
Laravel Framework 5.7.19
。在我的例子中,我的工厂文件是从命令行make:factory
生成的。文件中的默认模型为:
$factory->define(Model::class, ...
您应该将名称Model
更改为您真正想要使用的名称,在我的例子中,它是\App\InterviewQuestion
,因此它变成:
$factory->define(\App\InterviewQuestion::class, ...
如果对PHPUnit没有任何帮助
对于那些在测试中遇到相同问题的读者,我发现我忘了在
setUp
方法中添加parent::setUp()
。我试图从tinker测试模型工厂。我已经创建了模型工厂,如上面的线程和其他Laravel文档所述。但它不会运行并抛出带有消息的InvalidArgumentException
无法找到名为[默认应用程序/游戏]的工厂
我在Tinker命令行中运行它,如下所示:
factory('\App\Game')->create();
过了一段时间,我发现问题在于前面的反斜杠\
。我像下面那样运行它,它运行得很好
factory('App\Game')->create();
愚蠢的事情,但可能会帮助某人。这可能是缓存问题。您可以通过执行以下命令来解决此问题
php artisan clear-compiled
composer dump-autoload
php artisan optimize
在我的例子中,错误是我导入了错误的测试基类。我没有扩展Laravel的Tests\TestCase,而是从PHPUnit导入了TestCase类。很傻,但我花了很长时间才弄明白这一点。有时可能是因为导入了错误的测试用例
使用PHPUnit\Framework\TestCase代码>[错误:并引发此错误]
使用测试\TestCase代码>[正确]没有一个答案对我有用
因此,我删除了我的工厂并再次创建它(每一个工厂都与以前的工厂相同),这个问题为我解决了上面的答案都不适用于我。
完全修复此错误的最佳方法是在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');
}
如果您在使用单元测试时遇到此问题,这可能会解决您的问题。
使用
Tests\TestCase
而不是
PHPUnit\Framework\TestCase
我也有同样的问题。什么都试过了。什么都没用。然后我退出Tinker并再次启动它,它成功了 名称和名称空间是否正确?类真的存在吗?不应该是App
而不是App
?此外,错误信息显示Commnet
,因此如果您真的复制粘贴了上述代码,则错误来自其他地方。对不起。我抄错了。我编辑了我的帖子你定义了模型工厂了吗?我的问题是我一直在使用App\Contact
而不是\App\Models\Contact
(注意,我在开头需要一个斜杠,还有\Models
)。当你查看中的第129行时,你就会明白为什么@angle Coder是正确的。目前你的评论课还没有定义。谢谢你的帮助!我不知道为什么,但我的代码就是这样工作的。我想指出的是,即使看起来很明显,文档中也没有说明使用App\Comment,这让我觉得工厂的创建是“神奇的”。那是我的问题,那是我没有用的地方。谢谢你指出,我找错了地方。考虑到其他一切都是对的,可能省了我一整天的时间。解决了我的问题。我认为没有必要调用父类,但显然这是必需的!在我的本地TestCase类中定义了一个_构造方法(我的所有测试都扩展了该方法)之后,我必须对其运行parent::setUp(),以避免覆盖默认行为。这也是我的案例中的问题。我立即删除setup()
方法,我的测试开始运行。使用php artisan make:test MyTest--unit
通过了示例测试。但实际上是在使用:使用PHPUnit\Framework\TestCase代码>谢谢!这确实是一种奇怪的行为,Laravel在我的代码库中包含了自己的抽象TestCase
类,但当它使用make:test
PHPUnit\Framework\TestCase
生成测试时不打算使用它,而Laravel的tests\TestCase
用于单元测试。单元测试必须单独测试代码。他们甚至不应该启动Laravel框架
<?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');
}