Laravel入門 テストファーストでのToDo削除画面の作成(第17回)

2021-01-01
2 min read

ToDo の削除機能を追加します。

画面レイアウトと仕様

タスク編集画面に削除ボタンを設けます。

task編集画面削除ボタン

削除ボタンの仕様は下記になります。

イベント URL 備考
削除ボタン /tasks/{id} delete

削除ボタンをクリックすると、削除要求をサーバ側に送信します。その送信先が、/tasks/{id}で、送信方法が delete です。

テストケースとテストコード実装

考えられる大まかなテストケースとしては下記になります。

  • 指定のテスクが削除されること
  • 呼び出し元のタブに戻ること

上記テストケースをコーディングする前にテストケースクラスを作成します。

$ php artisan make:test TaskDeleteTest

生成後にuse RefreshDatabaseなど必要なものを追記します。

指定のタスクが削除されること

id を key として、task テーブルからタスクを削除できることを確認します。

public function testDelete()
{

  factory(Task::class,1)->state('Ready')->create();
  factory(Task::class,1)->state('Doing')->create();
  factory(Task::class,1)->state('Done')->create();
  $task = factory(Task::class)->state('notReady')->create();

  $data =[
  'id' => $task->id,
  ];

  //databaseに該当のものが存在することを確認
  $this->assertDatabaseHas('tasks', $data);

  $response = $this->delete(route('task.delete',$data));
  $response->assertRedirect('/');

  //databaseに該当のものが存在しないことを確認
  $this->assertDatabaseMissing('tasks', $data);

}

テスト実施

テストを実施します。

$ ./vendor/bin/phpunit tests/Feature/TaskDeleteTest.php --testdox

テストはすべてエラーになることを確認します。 テストコードに間違いがある場合は修正します。

実装

router

web.phpに、ルートを追加します。 http メソッドが delete になります。

Route::delete('/tasks/{id}', 'TaskController@destroy')->where('id', '[0-9]+')->name('task.delete');

コントローラ

TaskController に destroy メソッドを追加します。

public function destroy($id)
{

    $success = Task::destroy($id);
    return redirect(route('home'));

}

画面

削除ボタンをSubmitボタンの左横に追加します。 edit.blade.phpを修正します。

削除ボタンを追加


<div class="d-flex justify-content-end">

    <!-- delete 追加 -->
    <button class="btn btn-danger me-2" form="delete">Delete</button>
    <!-- /delete 追加 -->

    <button class="btn btn-primary me-2">Submit</button>

    <a class="btn btn-secondary" href="{{route('home') }}">Cancel</a>
</div>

formの追加

@method('DELETE')の指定が必要なため登録とは別のformになります。 edit.blade.phpの 最後の方の</form>@endsectionの間に追加します。

</form>

<!-- form 追加 -->
<form id="delete" method="POST" action="{{ route('task.delete',['id'=>$task->id]) }}">
    @method('DELETE')
    @csrf
</form>

@endsection

テスト

$ ./vendor/bin/phpunit tests/Feature/TaskDeleteTest.php --testdox
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

Task Delete (Tests\Feature\TaskDelete)
 ✔ Delete

Time: 937 ms, Memory: 34.01 MB

OK (1 test, 4 assertions)

念のためブラウザテストを行っておきます。

$ php artisan dusk tests/Browser/EditTaskTest.php
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

...                                                                 3 / 3 (100%)

Time: 8.94 seconds, Memory: 34.01 MB

OK (3 tests, 5 assertions)