Mock today

In some of my unit tests, I find the need to set today to a different
value than the actual today. For example, to test the model method
"balance_of_today", which takes no argument, I want to have
be a specific date for the purpose of testing. In other words, I want
to do something like this:

mock_today(, 2, 1)) do
    ... test code...

My implementation for mock_today is:

  def mock_today(date)
    $_mock_test_date = date

    Date.class_eval do
      class <<self
        alias original_today today



    Date.class_eval do
      class <<self
        alias today original_today

So my questions are:

1) Is it a good idea to mock

2) Can my implementation of mock_today be improved? I'm particularly
worried about of the use of global variable, and of class_eval, since
I heard class_eval is becoming outdated as Ruby 1.9 is coming out.

I occasionally "timetravel" by overriding (and
calls eventually).
It goes a little like this

class Time
  cattr_accessor :frozen_now
  self.frozen_now = nil
  class << self
    def now_with_freeze
      if @@frozen_now
   alias_method_chain :now, :freeze

Then you freeze by doing Time.frozen_now = ... and unfreeze by setting
it back to nil. You could easily refactor this to have a block like


Or use flexmock:

require 'rubygems'
gem :flexmock
require 'flexmock/test_unit'

# then in your test

     stopped_clock =, 2, 1)


Rob Biedenharn

Thanks, both of these are good suggestions. I will look into them.