InvalidArgumentException: невозможно найти фабрику с именем [по умолчанию] - laravel, faker, phpunit - PullRequest
0 голосов
/ 30 октября 2019

Поскольку я разрабатываю пакет, поэтому я помещаю свои фабрики в произвольный путь, например:

-- app

-- packages

-----mockizart

-------blog

---------database

--------------factories

----------------- PageModelFactory.php

---------src

, вот так я загружаю фабрику в своем сервис-провайдере (я уже проверяю, что путь правильный, нажавэто на phpstorm):

function boot()
{
 Factory::construct($this->app->make(\Faker\Generator::class), __DIR__."/../database/factories");
}

это моя фабрика моделей страниц (я уже убедился, что этот файл действительно загружен):

<?php

/** @var \Illuminate\Database\Eloquent\Factory $factory */
use Mockizart\Blog\Dodols\PageModel;
use Faker\Generator as Faker;


$factory->define(PageModel::class, function (Faker $faker) {
    return [
        'name' => "retretre",
        'slug' => "retretret",
        'type' => 0,
        'category' => 0,
        'tags' => "",
        'content' => "",
    ];
});

и это мой тестовый скрипт:

use Mockizart\Blog\Dodols\PageModel;
    .....
    .....
/** @test */
public function edit_page()
{
   dd(PageModel::find(1)); <-- this return was NULL so I think my class and namespace does exist.

   factory(PageModel::class)->make(); <-- this cause error "unable to locate factory......"
   $response = $this->get('/blog/page/edit/15');
   $response->assertStatus(200);
}

1 Ответ

0 голосов
/ 31 октября 2019

, поэтому, если вы используете orchestra\Testbench, правильный способ загрузки пользовательских фабрик - это метод setUp() вашего класса Test или TestCase NOT в вашем Service Provider.

* 1007. * код будет выглядеть так:
class TestCase extends \Orchestra\Testbench\TestCase
{
   public function setUp(): void
   {
     parent::setUp();
     // additional setup
     $this->loadMigrationsFrom(__DIR__ . '/../database/migrations');
     $this->withFactories(__DIR__.'/../database/factories');
   }

   protected function getPackageProviders($app)
   {
       return BlogServiceProvider::class;
   }
}
...