你如何模拟OpenCascade?

时间:2011-08-30 19:23:46

标签: ruby rspec

OpenCascade是Hashery的递归OpenStruct:

http://rubyworks.github.com/hashery/

它允许您通过一系列键来引用散列中的嵌套值:

h = {:a=>1,:b=>{:x=>1,:y=>2}}
c = OpenCascade.new(h)
c.b.y
=> 2

我们正在使用它来读取YAML配置。现在我们想在测试中模拟值,但是

mock(c.b).y { 5 }

不起作用。我们如何嘲笑它?

1 个答案:

答案 0 :(得分:0)

当问到问题时,OpenCascade的{​​{3}}的实施每次查询Hash时都会创建一个新对象:

def method_missing(sym, *args, &blk)
  # ...snip..
  if key?(name)
    self[name] = transform_entry(self[name])
  # ...snip...
  end
end

private

#
def transform_entry(entry)
  case entry
  when Hash
    OpenCascade.new(entry) #self.class.new(val)
  when Array
    entry.map{ |e| transform_entry(e) }
  else
    entry
  end
end

这意味着在该版本中有以下内容:

c.b equal? c.b
# => false

这就是为什么嘲弄c.b不起作用......

此后一直在修复。