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