第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)

無事にパスした。

今回のメソッドに引数があるが、これがきちんと使えるかどうかはまだわかっていない。 これについては、後々確認していこう。

Last Updated (JST): 7/7/2019, 2:32:08 PM