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 }