# Laravel教科書第2版 p.345 ユニットテスト ## 困りごと 教科書通りに書くと,Factory 周りの書き方が Laravel8.x 以降では変更されているためにエラーが出てしまいます. ## 解決方法 `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; class HelloTest extends TestCase { /** * A basic feature test example. * * @return void */ public function testHello() { $this->assertTrue(true); $response = $this->get('/'); $response->assertStatus(200); $response = $this->get('/hello'); $response->assertStatus(302); /** @var mixed $user */ $user = User::factory()->make(); $response = $this->actingAs($user)->get('/hello'); $response->assertStatus(500); $response = $this->get('/no_route'); $response->assertStatus(404); } } ``` ## 教科書からの変更点について 以下,教科書p.344 のリスト7-42のコードからの変更点について書きます. ### use文 教科書には `use App\User` を追記せよと書かれていますが,Laravel 9.x 用に `use App\Models\User` と書き直しています. ### factory 教科書では ```php= $user = factory(User::class)->create(); ``` という書き方になっていますが,factory の書き方は Laravel 8.x 以降では変更されています.それに合わせて書き直しています. ### Status(500) 教科書では対応する個所は 500 ではなく 200 になっています. そのまま `vendor\bin\phpunit` を実行したところ > Failed asserting that 200 is identical to 500. というエラーメッセージが出たので,200 を 500 に変更したところエラーが消えました. 意味はあまりわかっていません. ### @var 私は VSCode に php Intelephense という拡張機能を入れているのですが,その拡張機能によって `actingAs($user)` の部分にエラーが出されていました. テストは正しく動作するにも関わらず拡張機能によってエラーが出されるというのはあまり気分が良くないので,エラーを消す方法を調べたところ,型(type)が書かれていないのがまずいのだということがわかりました. 参考:[Stackoberflowのページ](https://stackoverflow.com/questions/69609428/intelephense-error-on-vs-code-expected-type-string-found-string) `$user` は `UserFactory` によって生成されているわけなので,`UserFactory` の返り値の型指定 `array<string, mixed>` に倣って `mixed` を指定したところ,エラーが消えました. 上記のコードにある `@var mixed $user` というのは,変数 `$user` の型が `mixed` であるということを主張しています.
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up