第1章 タスクリスト表示
01.ルート設定とテストのためのコントローラ実装
いよいよ、本格的にシステムの作成に取り掛かろう。
これから作るのはWebシステムなので、特定のURL(ルート)に対して意図した機能が働くようにしていく必要がある。 まずは、「特定のURL」の準備からだ。今回はタスクの一覧ページのURLを設定してみよう。
タスクリスト表示のためのルート設定
タスクリスト表示のためのルート設定を行なうために、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');
18行目を追加した。/tasks
というルートが指定された場合に、この行が反応するようになる。
ルートの確認のためのテスト
では、このルートが正しく動くか、確認するためのテストを書こう。
もちろん、ルートは用意したが、その先のコントローラはまだ用意していない。 つまり、テストをしても必ず「失敗」となる。 今までであれば、このタイミングでテストを書くことは無かっただろう。 そして、きっとここを読んで「そんなテストコードを書く必要があるのか?」と思っているはずだ。
しかし、ここで書いておくことに意味がある。 「ルートとコントローラが本当に正しく結びつくか」という、フレームワークを使っていれば 当然にできることだが、それをきちんと確認できるようになる、ということが大切だ。 自分のやったことが「確実に正しい方向に向かっている」ということを感じながらコーディングを行なう、 このリズムを掴んで欲しい。
本来のTDD
であれば「実装の前に必ずテストを書く」ので、ルートの設定を行なう前にテストを書き始めることになる。
ただ、ここでそれをやるとテストが成功するまでに「ルートの設定」と「コントローラの実装」という二段階の作業が必要になる。
このドキュメントは、そもそもフレームワークを使い慣れていない人に向けたものなので、 テストの成功までにあまり多くのステップを入れないように考えている。 まずは、テストコードを書くことと、テストを成功させること、のリズムを掴めるようにしている。
では、テストを作成してみよう。 テストファイルのベースは、下記のようにコマンドで生成できる。
$ php artisan make:test TaskControllerTest
Test created successfully.
これで、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);
}
}
テストファイルにtestGetAllTasksPath()
というテストを実装した。
では、実際にテストを実行してみよう。
$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
.F. 3 / 3 (100%)
Time: 509 ms, Memory: 16.00MB
There was 1 failure:
1) Tests\Feature\TaskControllerTest::testGetAllTasksPath
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:20
FAILURES!
Tests: 3, Assertions: 3, Failures: 1.
予定通りではあるが、テストに失敗してしまった。
ルートに対応したコントローラクラスとメソッドの実装
テストに失敗したので、これを解消する必要がある。
今回は、そもそも定義したルートに対応したコントローラクラスとメソッドが未実装だ。 なので、これを実装すれば良いはずだ。
定義したのは、コントローラのクラス名TaskController
と、メソッド名index()
。
これを実装しよう。
コントローラクラスのファイルも、コマンドで生成できる。
$ php artisan make:controller TaskController
Controller created successfully.
これでapp/Http/Controllers/TaskController.php
というファイルが生成される。
これに、index()
メソッドを実装しよう。
今までならこのタイミグで「リストの一覧画面を作るには...」と考えることになると思うが、
ここではそこまで考え無くていい。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class TaskController extends Controller
{
public function index()
{
return "all tasks";
}
}
戻り値が明らかに仮のものではあるが、とりあえず必要なコントローラクラスとメソッドを実装した。 先にも書いたが、ここで100点のコードにする必要はない。 「とにかくテストを成功させる」、というコードを実装してしまおう。
では、これでテストを実行してみよう。
$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
... 3 / 3 (100%)
Time: 357 ms, Memory: 12.00MB
OK (3 tests, 3 assertions)
今度は成功だ。 これで、ルートに対応する要素として、必要なものが揃ったことを確認できた。
先ほども書いているが、メソッドが返している中身は今の所は気にしないで進める。
ちなみに、サンプルのテストが存在するので、3 tests
となっている。
不要なファイルなので、この段階で削除しておこう。
tests/Feature/ExampleTest.php
tests/Unit/ExampleTest.php
ファイルを削除したことで、状況が変化した。再度テストを実行しておこう。
$ $ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 406 ms, Memory: 12.00MB
OK (1 test, 1 assertion)
当然だが、問題なく実行できた。 しかし、状況の変化があれば実行しておくことで、「問題無いこと」を常に確認できる。 テストを用意しておけば、実装したコードが安全であること(意図通りであり続けること)を簡単に確認できる。
何か変化があったらすぐにテストを実行する、という意識を持っておいて欲しい。