Rubyにおけるモックとスタブについて

Mochaが楽しそう - LukeSilvia’s diary

スタブはただ偽装するだけ、モックは引数や呼ばれた回数等のチェックを行う。
チェック機能がほしいときにモックを使って、そうじゃなけりゃスタブを使う。

require 'test/unit'
require 'rubygems'
require 'mocha'
class TestMock < Test::Unit::TestCase
  def test_stub
    o = stub
    # foo(*args) -> 2 なる偽装をするだけ
    o.stubs(:foo).returns(2)
    assert_equal 2, o.foo(9999)
  end

  def test_mock
    klass = Class.new do
      def foo(x)
        bar(x*2)
      end

      def bar(x)
        x*3
      end
    end

    o = klass.new
    # bar(4)が呼ばれることを期待するモック
    o.expects(:bar).with(4)
    o.foo(2)
  end
  
end
# >> Loaded suite -
# >> Started
# >> ..
# >> Finished in 0.00139361 seconds.
# >> 
# >> 2 tests, 2 assertions, 0 failures, 0 errors

assert_*がひとつしかないのに「2 assertions」となっているのは、モックを作成して実際に呼ばれたときに引数のチェックをしているから、暗黙のassertionになっている。