第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では今回のやり方とは異なるバリデーション実装方法がある。 フォームリクエストバリデーションというやり方で、見つかるはずだ。

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