# Laravel教科書第二版p.347 リスト7-43 phpunit
## 困りごと
教科書のリスト7-43の通りに書いても `vendor\bin\phpunit` が通りません.
## 解決策
### PersonFactory.php
教科書のリスト7-38において,`UserFactory.php` に処理を追加して Person に関する Factory を作成するというのがありました.
あれは Laravel9.x ではそのまま実行することはできません.
`UserFactory.php` のコピーをもとに,同じディレクトリに `PersonFactory.php` というファイルを作成し,そこに次のように記述してください.
```php=
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
use App\Models\Person;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
*/
class PersonFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'name' => $this->faker->name(),
'mail' => $this->faker->safeEmail(),
'age' => random_int(1,99),
];
}
/**
* Indicate that the model's email address should be unverified.
*
* @return static
*/
public function unverified()
{
return $this->state(function (array $attributes) {
return [
'email_verified_at' => null,
];
});
}
}
```
### HelloTest.php
教科書では `use DatabaseMigrations` というコマンドを入れなさいと書かれていますが,それをコメントアウトします.このMigrationコマンドを残しておくと,毎回Tableを初期化されてしまってエラーになります.
Factoryまわりも書き換えます.
具体的には,`HelloTest.php` には次のように記述してください.
```php=
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Tests\TestCase;
use App\Models\User;
use App\Models\Person;
class HelloTest extends TestCase
{
// use DatabaseMigrations;
/**
* A basic feature test example.
*
* @return void
*/
public function testHello()
{
User::factory()->make([
'name'=> 'AAA',
'email'=> 'BBB@CCC.COM',
'password'=> 'ABCABC',
]);
User::factory()->count(10)->make();
$this->assertDatabaseHas('users',[
'name'=> 'AAA',
'email'=> 'BBB@CCC.COM',
'password'=> 'ABCABC',
]);
Person::factory()->make([
'name'=> 'XXX',
'mail'=> 'YYY@ZZZ.COM',
'age'=> '123',
]);
Person::factory()->count(10)->make();
$this->assertDatabaseHas('people',[
'name'=> 'XXX',
'mail'=> 'YYY@ZZZ.COM',
'age'=> '123',
]);
}
}
```
### phpunit.xml
教科書ではリスト7-36において `database_test.sqlite` を参照するように書き換えなさいという指示がありますが,ややこしいので `database.sqlite` のままにしておきます.
### database.sqlite
`php artisan migrate` を実行してマイグレーションしておきます.
DBBrowserを開いて,database.sqlite の users というTableと people というテーブルに HelloTest.php で要求している要素をそれぞれ追加します.
:::warning
このときにDB Browser のわかりにくいUIに注意してください.
検索窓と,要素を追加するための窓が区別しづらいUIになっています.
:::
以上でエラーが消えるはずです.