RSpecのおかげで何となくモックの使いどころが分かってきたかも

もちろんテストが先だが、最終的にこんなコードにしたいとする。

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

スッキリ書けたし、何となくそれっぽくないすか?


イマイチまだつかみきれずにモヤモヤしてるところがあるんで精進さねばねなー。