somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【TDD】テスト駆動開発入門10章完了【php】

ようやく2桁です。

今回行ったこと

  • timesメソッドでのオブジェクト生成にファクトリメソッドを使用しないように戻した
  • 実験として、FrancクラスではなくMoneyクラスを生成できるようにし、抽象クラスから元に戻した
    しかし、書籍(Java)と同じようにならなかった
  • phpでのtoStringはマジックメソッド「__toString」を用いる
    class Money {
        public function __toString() {
            return sprintf('%s %s', $this->amount, $this->currency);
        }
    }
    

    PHPUnitではJUnitとは違い、__toStringが実行されず下記メッセージが表示されます。
    Failed asserting that two objects are equal.
    --- Expected
    +++ Actual
    @@ @@
    -Franc Object
    +Money Object
     (
         [amount:protected] => 10
         [currency:protected] => CHF
     )
    
  • 10フラン(Money)と10フラン(Franc)は等しいが、比較の際にクラスを使用しているためにテストに失敗した
  • Francクラスを生成するように戻し、上記が正しいことを確認するために、通貨の種類を用いてテストを追加した

PHPUnitの問題

書籍どおりに、Franc#timesメソッドがMoneyクラスを生成するように戻しましたが、実験時と同じエラーが発生しました。
エラーが発生した理由は、PHPUnitのassertEqualsのエラーを出力する条件が、期待値と実測値が完全一致していない場合であるからです。
PHPはもちろん静的型付でないので、FrancクラスはMoneyクラスを継承していても、生成時のクラスはFrancであるからと思います。
つまり、Money#ファクトリメソッドでもMoneyクラスを生成するように修正しないと意味が無いです。

おまけ エラー出力に関するクラス一覧


オブジェクトの継承関係を考慮したassertEqulasのようなメソッドはないとは思いますが、あったら教えてください。