もちろんテストが先だが、最終的にこんなコードにしたいとする。
class Task def initialize(&block) @block = block end def run @block.call end end
で、これまでならこんなテストを書いていたと思う。
describe Task do describe '#run' do before do @s = 'test' @task = Task.new do @s.reverse! end end it 'should call block' do @task.run @s.should == 'tset' end end end
余りにも作為的すぎるのをスルーしたとしても、はんかくさいことこの上ないっすな。
そこでモックですよ。
describe Task do describe '#run' do let(:block) { double :block } let(:task) { Task.new { block.call } } it 'block called once' do block.should_receive(:call).once task.run end end end
スッキリ書けたし、何となくそれっぽくないすか?
イマイチまだつかみきれずにモヤモヤしてるところがあるんで精進さねばねなー。