I want to seed database when I use this
public function run()
{
$users = factory(app\User::class, 3)->create();
}
Add three user in database but when I use this
public function run()
{
$Comment= factory(app\Comment::class, 3)->create();
}
Show me error
[InvalidArgumentException]
Unable to locate factory with name [default] [app\Comment].
By default the laravel installation comes with this code in the database/factories/ModelFactory.php
File.
$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),
];
});
So you need to define a factory Model before you use it to seed database. This just uses an instance of Faker Library which is used to generate fake Data for seeding the database to perform testing.
Make sure You have added a similar Modal Factory for the Comments Model.
So your Comments Model Factory will be something like this :
$factory->define(App\Comment::class, function (Faker\Generator $faker) {
return [
'comment' => $faker->sentence,
// Any other Fields in your Comments Model
];
});
If nothing helps with PHPUnit.
For those of readers who stuck with the same issue in tests, I found out that I forgot to add parent::setUp()
in setUp
method.
This can also happen when you are running the command factory()->create()
from php artisan tinker
. Make sure you save the file database/factories/ModelFactory.php
before opening tinker
1º Step - Make sure CommentFactory is using Comment instead of Model.
use App\Comment
...
$factory->define(Comment::class, function (Faker $faker){
2º Step - Verify that the names are correct in CommentsTableSeeder.
use App\Comment
...
public function run()
{
factory(Comment::class, 3)->create();
}
Good luck!
I'm using laravel 5.5 and for that doing this is bit different. You have to create CommentFactory.php inside \database\factories directory and add this inside,
$factory->define(App\Comment::class, function (Faker\Generator $faker) {
return [
'comment' => $faker->sentence,
// Any other Fields in your Comments Model
];
});
And add this,
$Comment= factory(\App\Comment::class, 3)->create();
instead of
$Comment= factory(app\Comment::class, 3)->create();
I just wanted to add this since I'm facing the same issue for later version and this thread helped me a lot to fix it.
This could be a cache problem. You can resolve it executing the commands following commands.
php artisan clear-compiled
composer dump-autoload
php artisan optimize
I'm using Laravel Framework 5.7.19
. And in my case, my factory file is generated from command line make:factory
. The default model in the file is:
$factory->define(Model::class, ...
You should change the name Model
to the thing you exactly want to use, in my case it is \App\InterviewQuestion
, so it becomes:
$factory->define(\App\InterviewQuestion::class, ...
I was trying to test Model Factory from tinker. I had created model factory as explained in above thread and other Laravel docs. But it would not run and threw an InvalidArgumentException
with message
Unable to locate factory with name [default] [/App/Game]
I was running it in Tinker command line as:
factory('\App\Game')->create();
After some time, I found that problem was the leading backslash \
. I ran it like below and it worked fine.:
factory('App\Game')->create();
Silly thing, but may help someone.
来源:https://stackoverflow.com/questions/36421287/laravel-5-2-unable-to-locate-factory-with-name-default