テストしにくい状況って色々な原因があると思いますが、
今回はグローバル関数への依存について。
例えば下記のコードでは
receiveDataメソッドの中でmail関数を呼び出しているので
テストしにくくなっています。
(テストは書けるけどテスト走らせる度にメールが飛ぶのはアレですね)
レガシーコード改善ガイドでは
グローバル関数の部分をインスタンスメソッドにして、処理をグローバル関数にまるっと委譲することで、接合部を作る方法が紹介されています。
例えばこんな感じでしょうか。
接合部となったメソッドをサブクラスでオーバーライドしてテストしてます。
ただ、わざわざサブクラスを定義するのも面倒な気もするし
もう少しカジュアルな方法がないかなということで
テストのためにややプロダクションコードが増えますがメソッドの差し替えができるようになりました。
ちなみに、無名関数の中でアサーションが書けるのでmail関数が受け取る引数をアサートすることもできます。
こんな感じです。
ここまで書いておいてあれですが、こちらにもっと良い方法が解説されていました。
PHPメンターズ -> 時計オブジェクト(ドメインクロック)を導入してテスト容易性と意図性を高める