第4章 タスクの追加
05.一覧画面からの遷移実装
ビューの実装とテスト
最後は、一覧画面から新規登録画面への遷移を実装しよう。
いや、遷移のテストから実装しよう。
tests/Browser/TaskIndexTest.php
を下記のようにする。
<?php
namespace Tests\Browser;
use App\Task;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class TasksIndexTest extends DuskTestCase
{
(略)
/**
* Index To New Test.
*
* @throws \Throwable
*/
public function testIndexToNew() {
$this->browse(function (Browser $browser) {
$browser->visit('/tasks')
->assertSeeLink('新規追加')
->clickLink('新規追加')
->waitForLocation('/tasks/new')
->assertPathIs('/tasks/new');
});
}
}
一覧画面から「新規追加」のリンクをクリックし、 新規登録画面に遷移したかのチェックを行なう、という流れだ。
では、テストを実行してみよう。
$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
...................F 20 / 20 (100%)
Time: 29.08 seconds, Memory: 22.00MB
There was 1 failure:
1) Tests\Browser\TasksIndexTest::testIndexToNew
Did not see expected link [新規追加] within [body].
Failed asserting that false is true.
/Users/[ユーザ名]/task-manager/task-manager/vendor/laravel/dusk/src/Concerns/MakesAssertions.php:423
/Users/[ユーザ名]/task-manager/task-manager/tests/Browser/TasksIndexTest.php:64
/Users/[ユーザ名]/task-manager/task-manager/vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php:67
/Users/[ユーザ名]/task-manager/task-manager/tests/Browser/TasksIndexTest.php:68
FAILURES!
Tests: 20, Assertions: 55, Failures: 1.
「新規追加」というリンクが無いので、当然失敗となる。 では、ビューの実装を行なおう。
resources/views/tasks/index.blade.php
を、下記のようにする。
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
crossorigin="anonymous"></script>
<title>Tasks</title>
</head>
<body>
<div class="container">
<h2>Tasks List</h2>
<div class="col-md-2">
{{ link_to_action('TaskController@new',
'新規追加',
[],
['class' => 'btn btn-primary btn-block']) }}
</div>
<ul>
@foreach ($tasks as $task)
<li><a href="/tasks/{{ $task->id }}">{{ $task->title }}</a> <input type="checkbox"
name="checkbox_{{ $task->id }}" {!! $task->executed ? 'checked="checked"' : '' !!}>
</li>
@endforeach
</ul>
</div>
</body>
</html>
タスクの一覧の上に、「新規追加」のリンクを(ボタン型になるように)表示させている。 これで、再度テストを実行する。
$ vendor/bin/phpunit
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.
.................... 20 / 20 (100%)
Time: 35.35 seconds, Memory: 22.00MB
OK (20 tests, 56 assertions)
成功となった。
これで、タスクの追加機能も実装完了だ。
本章のまとめ
今回は機能追加とともに「バリデーション」の実装も行なった。
バリデーションを実装することで、 「安全なデータ」をコントローラーやモデルで処理することができるようになる。 つまり、「例外処理」となる部分を、できるだけ少なくすることができるわけだ。
プログラムを書く上で、制限を正しく保つことは、 制限外のものを「予測された例外」として取り扱うことを意味している。 「予測された例外」は、それが発生した場合にシステムがどう振る舞うか、 ということがきちんと明示されている状態のことだ。
コントローラーのメソッドで逐一if
文などの判定を行なっても良いが、
非常に煩雑だ。
フレームワーク(ここではLaravel)の機能によって、 こういうバリデーション処理の取り扱いは楽になることが多い。 積極的に使うことで、どのような値が来ても「予測された例外」として処理できれば、 ユーザーに無駄にストレスを与えることも抑えることができる。
練習問題として、「タスクの更新」においてもバリデーションを実装してみて欲しい。
またその際に、Laravelでは今回のやり方とは異なるバリデーション実装方法がある。
フォームリクエストバリデーション
というやり方で、見つかるはずだ。