14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

privateメソッドのテスト

Last updated at Posted at 2016-11-15

privateメソッドのテストがしたい

概要

privateメソッドのテストは必要ないというような見解もありますが(コチラ)、
時と場合によっては書きたい時もあるかと思います。

今回は、

  • 対象クラスのtestコードが今まで無かった
  • 1つのpublicクラスで全privateメソッドを呼んでいるという仕様
  • 全部書く時間は無いのでとりあえず今回触る1privateメソッドのみtestコードを記載したい

というような状況だったため、privateメソッドを書くこととしました。

環境

  • ruby 2.1.8
  • Test::Unit を使用

解決策

sendメソッド の利用

test 'sample_test' do
    expected = 'expected result'
    @model = TestModel.new
    actual = @model.send(:sample_private_method)
    assert_equal expected, actual
end

その他回答

how detail example
send レシーバの持つメソッドを呼び出すことができる。 1.send(:+, 2) # 1 + 2 => 3
__send__ sendの別名。sendメソッドを上書きして別の機能に当てたクラスでも、このメソッドで呼び出せる。 1.__send__(:+, 2)
instance_eval 渡されたブロックをレシーバのインスタンスの元で実行できる。関数定義、値設定、関数実行なんでもござれ。 cat.instance_eval{def test(val); p val;end;}
cat.instance_eval{test "sample"}

Ref

privateメソッドをスタブ化したい

このようなシチュエーションもある。
この場合は下記のように、allow_any_instance_ofを使えば実現可能

allow_any_instance_of(TargetClass).to receive(:private_method) { return_value }
14
9
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?