# 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になっています. ::: 以上でエラーが消えるはずです.