Time.nowのテスト? それMochaでできるよ

[ruby][rails]テストの時にTime.nowで好きな時間を使えるようにするMock - よしだメモ

Time.nowは偽装しないとテストは書けない。
だったらこんなまわりくどいことしないでMocha使おうよ。stubで簡単に偽装できるから。
Mochaの偽装のスコープはテストメソッドが終わるまで。テストメソッドが終わったら勝手に偽装の後片付けをしてくれる。
テストするならばモックとスタブは是非身に付けたいところ。

ちなみに1993/2/24はRubyの誕生日だ。

def current_date
  Time.now.strftime "%Y/%m/%d"
end

require 'test/unit'
require 'rubygems'
require 'mocha'
class TestTimeNow < Test::Unit::TestCase
  def test_current_date
    Time.stubs(:now).returns(Time.local(1993,2,24))
    assert_equal "1993/02/24", current_date
  end
end
# >> Loaded suite -
# >> Started
# >> .
# >> Finished in 0.007321158 seconds.
# >> 
# >> 1 tests, 1 assertions, 0 failures, 0 errors

expectationsはMocha組み込みなのであっさり書ける。

require 'rubygems'
require 'expectations'

Expectations do
  expect "1993/02/24" do
    Time.stubs(:now).returns(Time.local(1993,2,24))
    current_date
  end
end
# >> Expectations .
# >> Finished in 0.001 seconds
# >> 
# >> Success: 1 fulfilled

ザ・ワールドの他の実装についても

追記

むしゃくしゃしてやった(ry

require 'test/unit'
require 'rubygems'
require 'mocha'
class TestDio < Test::Unit::TestCase
  def test_the_world
    now = Time.now
    # ザ・ワールド!時よ止まれ
    Time.stubs(:now).returns(now)
    sleep 2
    assert_equal now, Time.now
  end

  def teardown
    # そして時は動きだす
  end
end
# >> Loaded suite -
# >> Started
# >> .
# >> Finished in 1.999748 seconds.
# >> 
# >> 1 tests, 1 assertions, 0 failures, 0 errors