activescaffold / active_scaffold

This URL has Read+Write access

active_scaffold / test / const_mocker.rb
100644 37 lines (31 sloc) 0.815 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class ConstMocker
  def initialize(*const_names)
    @const_names = const_names
    @const_states = {}
    @const_names.each{|const_name|
      @const_states[const_name] = Object.const_defined?(const_name) ? Object.const_get(const_name) : nil
    }
  end
  
  def remove
    @const_names.each{|const_name|
      Object.send :remove_const, const_name if Object.const_defined?(const_name)
    }
  end
  
  def declare
    @const_names.each{|const_name|
      Object.class_eval "class #{const_name}; end;" unless Object.const_defined?(const_name)
    }
  end
  
  def restore
    remove
    
    @const_states.each_pair{|const_name, const|
      Object.const_set const_name, const if const
    }
  end
  
  def self.mock(*const_names, &block)
    cm = new(*const_names)
    yield(cm)
    cm.restore
    true
  end
end