Laravel8 テストデータ

Laravelバージョン8のテストをFactoryとSeederを使って行っていきます。また、Laravelバージョン8はこれまでと記述の仕方が異なるので注意してください。
#Seeder
**・SeederはLaravelのクラスの一つになる。（Illuminate/Database/Seeder）**
**・Seederを使うことによってテストデータを簡単にデータベースに設定できる。**
**・artisanコマンドで生成・実行できる**
**・seederファイルを編集していく**
**・作成したseederをDatabaseDatabaseSeederファイルに登録して呼び出す**


#Factory
**・ElquentElquentモデルを使って、テストデータを作る時に便利な機能(使わなくてもできる)**
**・ElquentElquentモデルを自動でデフォルト値を設定できる**
**・1つの定義をしていれば複数のデータを一括で作成できる**
**・artisanコマンドで作成できる**
**・<a href="https://github.com/fzaninotto/Faker">Faker PHPライブラリ</a>を使う**


#流れ
(使うモデルは`Blog.php`)
**1.Seederを生成(database/seeders/ファイル名)**


```terminal:
$ php artisan make:seeder BlogsTableSeeder
```

**2.Factotyの生成(database/factories/ファイル名)**

```terminal
$ php artisan make:factory BlogFactory
```

作成されたファイルが下の二つのファイルです。
また、後で紹介しますが、Laravelバージョン8未満の方は表記が異なるので、注意してください。

```php:database/seeders/BlogsTableSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;//seederクラスを引き継いでいる


class BlogsTableSeeder extends Seeder//seederから継承してBlogsTableSeederを作る
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()//データベースに追加する処理をこの中に書く
    {
        
    }
}

```

```php:database/factories/BlogFactory.php
<?php

namespace Database\Factories;

use App\Models\Blog;//使いたいモデル
use Illuminate\Database\Eloquent\Factories\Factory;

class BlogFactory extends Factory//
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Model::class;//モデル名をパスから指定

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [//追加したいデータを中に記述
            //
            
        ];
    }
}
```


**3.Seederファイルで使いたいモデルを指定する(6行目あたりに)**

```php:database/seeders/BlogsTableSeeder.php
use App\Models\Blog;
```

**4.configのapp.phpで`Faker`の設定を日本語にしてあげる**

```php:config/app.php/109行目
'faker_locale' => 'ja_JP',
```

**5.Factoryファイルの編集**
使いたいモデルを指定してあげる

```php:database/factories/BlogFactory.php(3行目あたりに)
use App\Models\Blog;
```
```php:database/factories/BlogFactory.php(15行目あたりに)
protected $model = \App\Models\Blog::class;
```

`return`の中にテストデータを記述する。追加したいデータの一覧は<a href="https://qiita.com/tosite0345/items/1d47961947a6770053af">こちら</a>

```php:database/factories/BlogFactory.php
'title' => $this->faker->word,//titleというカラムにword型のデータを入れる
'content' => $this->faker->realText//contentにrealText型のデータを入れる
```

**6.Seederファイルで使いたいFactoryを指定**

```php:database/seeders/BlogTableSeeder.php
public function run()
    {
        \App\Models\Blog::factory()->count(15)->create();
      //   　モデル名　　　　　　　     作成したい数
    }
```

**7.DatabaseSeeder.phpにBlogTableSeeder.phpを定義してあげる**

```database/seeders/DatabaseSeeder.php
$this->call
(BlogsTableSeeder::Class);
```

**8.ターミナルでcofigを読み込む**

```terminal
$ php artisan config:clear
```

**9.DBに読み込む**

```terminal
$ php artisan db:seed
```

下記のようにDBを確認して情報が入っていれば成功です。
![image.png](https://i.gyazo.com/7fd3a2e916d941ebfb3cd3595bd42593.png)



#Laravelバージョン８未満との比較

```php:Factory.php(旧)
$factory->define(Model::class,function (Faker $faker){
 (Faker $faker) {
   return [
           'title' =>$faker->word,
           'content' =>$faker->realText       
   ];
});
```
```php:Factory.php(新)
protected $model = \App\Models\Blog::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            //
            'title' => $this->faker->word,
            'content' => $this->faker->realText
        ];
    }
```

```php:Seeder.php(旧)
public function run()
{
  factory(Blog::class, 15)->create();
}
```

```php:Seeder.php(新)
public function run()
{
 \App\Models\Blog::factory()->count(15)->create(); 
}
```



#終わり
参考サイト
https://qiita.com/tosite0345/items/1d47961947a6770053af
https://qiita.com/ntm718/items/47cb81b5bce4c428e8cc
https://www.youtube.com/watch?v=xOtnux8XRdk
https://stackoverflow.com/questions/63816395/laravel-call-to-undefined-function-database-seeders-factory