第2章 タスク詳細表示
01.ルート設定とテストのためのコントローラ実装
続いて「タスクの詳細画面」を表示できるようにしてみよう。 今回も、「ルートの設定」からだ。
タスク詳細表示のためのルート設定
タスク詳細表示のルート設定を行なうために、routes/web.php
を下記のように編集する。
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/tasks', 'TaskController@index');
Route::get('/tasks/{id}', 'TaskController@detail')->where('id', '[0-9]+');
19行目を追加した。/tasks/
の後に「数字」が指定されることで、この行が反応するようになる。
後ろの->where()
の記述によって、{id}
の中身を制限しているわけだ。
また、その「数字」はdetail
メソッドにおいて、$id
という引数に渡されることになる。
パスの分解処理などを書かなくても、すぐにメソッドで使えるようになるので非常に使いやすい。
ルートの確認のためのテスト
ルートを追加したので、今回もテストを書いていこう。 一歩進んだら必ずテスト、というリズムで進めることを忘れずに。
前回作成したtests/Feature/TaskControllerTest.php
に、テストメソッドを追加する。
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class TaskControllerTest extends TestCase
{
/**
* Get All Tasks Path Test
*
* @return void
*/
public function testGetAllTasksPath()
{
$response = $this->get('/tasks');
$response->assertStatus(200);
}
/**
* Get Task Detail Path Test
*
* @return void
*/
public function testGetTaskPath()
{
$response = $this->get('/tasks/1');
$response->assertStatus(200);
}
}
今回はtestGetTaskPath()
というテストを実装した。
/tasks/1
というパスなので、期待としては「タスクID:1」のタスクの詳細画面が見えるはず、、、というテストになる。
では、実際にテストを実行してみよう。
$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
.F. 3 / 3 (100%)
Time: 805 ms, Memory: 20.00MB
There was 1 failure:
1) Tests\Feature\TaskControllerTest::testGetTaskPath
Expected status code 200 but received 500.
Failed asserting that false is true.
/Users/[ユーザ名]/task-manager/task-manager/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:78
/Users/[ユーザ名]/task-manager/task-manager/tests/Feature/TaskControllerTest.php:32
FAILURES!
Tests: 3, Assertions: 7, Failures: 1.
今回も、予定通りの失敗だ。
ルートに対応したコントローラクラスとメソッドの実装
失敗の原因は、前回同様に定義したルートに対応したメソッドが未実装なためだ。
前回は対応するメソッドを仮実装することで、テストをパスした。 今回も同じ対応をしよう。
今回はapp/Http/Controllers/TaskController.php
に、detail()
というメソッドを実装する。
<?php
namespace App\Http\Controllers;
use App\Task;
use Illuminate\Http\Request;
class TaskController extends Controller
{
public function index()
{
$tasks = Task::all();
return view('tasks.index', ['tasks' => $tasks]);
}
public function detail(int $id)
{
return "detail";
}
}
こんな感じで、一旦はテストをパスできるはずだ。 テストを実行してみよう。
$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 589 ms, Memory: 14.00MB
OK (3 tests, 7 assertions)
無事にパスした。
今回のメソッドに引数があるが、これがきちんと使えるかどうかはまだわかっていない。 これについては、後々確認していこう。