プライベートメソッドのテストコード書くのかい、書かないのかい、どっちなんだい!!💪問題

ちょうど今このようなシチュエーションになり設計を悩んでいる
プライベートメソッドのテストは書かないもの?
自分もプライベートメソッドのテストコードは書かない派なのだが、時と場合によってはありえるなぁと感じたので整理してみようと思う
結論から言えば、結局かかなかったんですけどね〜
プライベートメソッドをテストしたくなったケース
サンプルコード
class Hoge
def func()
res = p_func_a()
async_p_func_a(res)
end
private
def p_func_a()
# Hogeのメンバを使った処理
end
def async_p_func_a(res)
# 非同期で外部のAPIに処理を投げる
end
end
funcはパブリックメソッド、振る舞いはasync_p_funcがしっかり処理を投げれたかどうかによる
この時一見、async_p_func_aが成功するかどうかはresの値(p_func_a)によるので、p_func_aをテストしたくなる
「ここはプライベートメソッドのテストコードを作成した方がいいかなー」と思った
しかし、ここでページトップの記事を思い出し、他の方法がないか考えてみたところ
こうすればいいんじゃないかと思ったのでまとめてみる
パブリックメソッドの振る舞いを変える
funcの振る舞いをresの値で変更すればいい
こんな感じ
class Hoge
def func()
res = p_func_a()
raise BadError if invalid?(res)
async_p_func_a(res)
end
...
end
これなら振る舞いが変わるので、funcのテストコードを修正 => funcを修正 => OKという流れになるなぁと
他にも...
記事内で紹介されているclassにわけるケースもありかなと思った
async_p_func_aは実は異なるclassに集約するべきもので、その中でraiseを上げる方が自然な気もする
まとめ
一見プライベートメソッドのテストケースが書きたい場合も、対応方法が色々あって面白いなと
動作するきれいなコードは、奥が深い
ただ早い!わかりやすい!のはプライベートメソッドをテストすることだなと思った