やみとものプログラミング日記 やみとものプログラミング日記
TOP テスト駆動開発でルーターを作る Part2
テスト駆動開発でルーターを作る Part2

テスト駆動開発でルーターを作る Part2

プログラミング
作成日時: 2020年7月8日
更新日時: 2020年7月8日
こんにちは、やみともです。
今回は前回「テスト駆動開発でルーターを作る Part1」の続きです。

前回まででテストメソッドを作り、テストを失敗させるところまで進みました。
今回はまず失敗したテストを通すところから始めます。

前回まで

$ p
PHPUnit 9.2.5 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 00:00.024, Memory: 4.00 MB

There was 1 error:

1) RouterTest::test_routing_index
Error: Class 'Router' not found

/Users/yuki/testblog/yamitomo_router/tests/RouterTest.php:11

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

実装

まずエラーを直す

エラー内容は「Error: Class 'Router' not found」つまり「Routerクラスがありません」です。
なので、Routerクラスを作成しましょう。

[ Router.php ]
<?php

class Router
{
}

もう一度pコマンド(alias p="vendor/bin/phpunit --color tests/" している)でテストを実行すると

$ p
PHPUnit 9.2.5 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 00:00.020, Memory: 4.00 MB

There was 1 error:

1) RouterTest::test_routing_index
Error: Call to undefined method Router::get()

/Users/yuki/testblog/yamitomo_router/tests/RouterTest.php:11

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

エラー内容が変わって「Error: Call to undefined method Router::get()」つまり「Routerクラスにgetスタティックメソッドがない」になりました。
どんどん進めます。

[ Router.php ]
<?php

class Router
{
    public static function get()
    {
    }
}

もう一度テストを実行すると

$ p
PHPUnit 9.2.5 by Sebastian Bergmann and contributors.

E                                                                   1 / 1 (100%)

Time: 00:00.022, Memory: 4.00 MB

There was 1 error:

1) RouterTest::test_routing_index
Error: Call to undefined method Router::routing()

/Users/yuki/testblog/yamitomo_router/tests/RouterTest.php:12

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

「Error: Call to undefined method Router::routing()」
routingメソッドも無いと言われたので実装します。
ここではとりあえずテストを通すため、以下のように値決め打ちでreturnする。

class Router
{
    public static function get()
    {
    }

    public static function routing()
    {
        return "Index";
    }
}

最初のテストが通る

ここまで実装すると、以下のように最初のテストが通ります。
$ p
PHPUnit 9.2.5 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:00.021, Memory: 4.00 MB

OK (1 test, 1 assertion)
値を決め打ちしたことなど、まだまだプログラムは完成していませんが、まずテストを通すことが重要です。
リファクタリングなどは全てのテストが通った後に、全てのテストが通る状態をキープしながら行うのが良いと思います。

次回予告 & 本紹介

次回以降もルーターライブラリを作っていきます。
ちなみにこれまでの説明もこれからの説明も下のテスト駆動開発の本を参考にしています。
テスト駆動開発に興味のある方は購入されてはどうでしょうか。