グローバル関数への依存を排除してテスタビリティを上げる

テストしにくい状況って色々な原因があると思いますが、
今回はグローバル関数への依存について。

例えば下記のコードでは
receiveDataメソッドの中でmail関数を呼び出しているので
テストしにくくなっています。
(テストは書けるけどテスト走らせる度にメールが飛ぶのはアレですね)

レガシーコード改善ガイドでは
グローバル関数の部分をインスタンスメソッドにして、処理をグローバル関数にまるっと委譲することで、接合部を作る方法が紹介されています。
例えばこんな感じでしょうか。

接合部となったメソッドをサブクラスでオーバーライドしてテストしてます。

ただ、わざわざサブクラスを定義するのも面倒な気もするし
もう少しカジュアルな方法がないかなということで

テストのためにややプロダクションコードが増えますがメソッドの差し替えができるようになりました。

ちなみに、無名関数の中でアサーションが書けるのでmail関数が受け取る引数をアサートすることもできます。

こんな感じです。

ここまで書いておいてあれですが、こちらにもっと良い方法が解説されていました。
PHPメンターズ -> 時計オブジェクト(ドメインクロック)を導入してテスト容易性と意図性を高める