「松原ガレッジ」のブログ

大阪府松原市にあるウェブ開発・HP制作をするところ。管理人が思ったことや困ったこと、課題についてまとめていきます。

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

プライベートメソッドのテストコードの記事

ちょうど今このようなシチュエーションになり設計を悩んでいる
プライベートメソッドのテストは書かないもの?

自分もプライベートメソッドのテストコードは書かない派なのだが、時と場合によってはありえるなぁと感じたので整理してみようと思う
結論から言えば、結局かかなかったんですけどね〜

プライベートメソッドをテストしたくなったケース

サンプルコード

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を上げる方が自然な気もする

まとめ

一見プライベートメソッドのテストケースが書きたい場合も、対応方法が色々あって面白いなと
動作するきれいなコードは、奥が深い

ただ早い!わかりやすい!のはプライベートメソッドをテストすることだなと思った