$this->json()
や$this->get()
などを使ってテストする場合、通常は例外処理も含めた形でテストが行われるので、バグで予期しない例外などが発生した場合でも通常はデフォルトの例外ハンドラが処理してステータス500を返す、という動作をしてしまいます。原因を調べたいならこの場合はエラーログに何か出力されている筈なのでそれを見てください。エラーログは設定を自分でいじっていなければstorage/logs
ディレクトリにある筈です。
例外処理のテストをするのでない場合は$this->withoutExceptionHandling()
であらかじめ例外処理を抑止しておくとphpunitの出力にエラーがそのまま出てくるようになるので、エラーログを開く手間が省けて便利です。
例:
app/Http/Controllers/FooController:
php
1<?php
2namespace App\Http\Controllers;
3
4class FooController extends Controller
5{
6 public function foo()
7 {
8 throw new \Exception('予期しないエラー');
9 }
10}
tests/Feature/FooTest:
php
1<?php
2namespace Tests\Feature;
3
4use Tests\TestCase;
5
6class FooTest extends TestCase
7{
8 public function testFoo(): void
9 {
10 $response = $this->get('/foo');
11 $response->assertOk();
12 }
13}
と準備してphpunitを実行した場合、
console
1% phpunit tests/Feature/FooTest.php
2PHPUnit 8.4.2 by Sebastian Bergmann and contributors.
3
4F 1 / 1 (100%)
5
6Time: 446 ms, Memory: 28.00 MB
7
8There was 1 failure:
9
101) Tests\Feature\FooTest::testFoo
11Response status code [500] does not match expected 200 status code.
12Failed asserting that false is true.
13
14/Users/matsui/src.nobk/laravel60/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:86
15/Users/matsui/src.nobk/laravel60/tests/Feature/FooTest.php:17
16
17FAILURES!
18Tests: 1, Assertions: 1, Failures: 1.
となり、エラーが起きたことはわかりますがphpunitの出力からは原因はさっぱりわかりません。
エラーログを見るとエラーの原因が出力されています
console
1% cat storage/logs/laravel-2019-11-27.log
2[2019-11-27 05:38:21] testing.ERROR: 予期しないエラー {"exception":"[object] (Exception(code: 0): 予期しないエラー at /Users/matsui/src.nobk/laravel60/app/Http/Controllers/FooController.php:13)
3[stacktrace]
4#0 [internal function]: App\Http\Controllers\FooController->foo()
5#1 /Users/matsui/src.nobk/laravel60/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
6#2 /Users/matsui/src.nobk/laravel60/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction('foo', Array)
7...(略)
$this->withoutExceptionHandling()
を追加して以下のようにすると、
php
1<?php
2namespace Tests\Feature;
3
4use Tests\TestCase;
5
6class FooTest extends TestCase
7{
8 public function testFoo(): void
9 {
10 $this->withoutExceptionHandling();
11 $response = $this->get('/foo');
12 $response->assertOk();
13 }
14}
phpunitの出力にエラーがそのまま書かれるようになります。
console
1% phpunit tests/Feature/FooTest.php
2PHPUnit 8.4.2 by Sebastian Bergmann and contributors.
3
4E 1 / 1 (100%)
5
6Time: 766 ms, Memory: 24.00 MB
7
8There was 1 error:
9
101) Tests\Feature\FooTest::testFoo
11Exception: 予期しないエラー
12
13/Users/matsui/src.nobk/laravel60/app/Http/Controllers/FooController.php:8
14/Users/matsui/src.nobk/laravel60/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
15
16...(略)
17ERRORS!
18Tests: 1, Assertions: 0, Errors: 1.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/27 11:15