概要
単体テストを記述するときは、他モジュールのメソッドをスタブとして表現し、テスト対象メソッドのロジックのみをテストできるようにしなくてはいけない。
テスト対象のメソッドが、他モジュールのメソッドに渡されたブロックの中で実行されている時、
他モジュールのメソッドをスタブにしつつ、そのスタブに渡されたブロックの中でテスト対象のメソッドを実行する方法について記す。
解決策
スタブを宣言する際に、その末尾にブロックを付与し、その呼び出しを付与してやれば良い。
例
例えば下記のようなメソッドにおいて、test_target
をテストしたいとする。
test_target
def example_method(argument)
other_module_object.stubed_method do
test_target_method(argument)
end
end
この時、other_module_object
のstubed_method
はブロックを引数に取るメソッドである。
テスト対象のメソッドはtest_target_method
なので、stubed_method
に渡されたブロックが実行されなければテスト対象のコードを実行できない。
この時、stubed_method
に対する記述を下記のようにしてやることで、stubed_method
に渡されたブロックを実行させることができる。
test_code
allow(other_module_object).to receive(:stubed_method) { |&dummy_block| dummy_block.call }
参考
http://rspec.info/documentation/3.5/rspec-mocks/#Arbitrary_Handling