如何模拟 OpenCascade?

发布于 2024-12-02 07:35:22 字数 400 浏览 0 评论 0原文

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 }

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

OpenCascade is a recursive OpenStruct from Hashery:

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

It allows you to refer to nested values in a hash via a sequence of keys:

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

We're using it to read in a YAML config. Now we'd like to mock the values in tests, however

mock(c.b).y { 5 }

doesn't work. How do we mock it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

邮友 2024-12-09 07:35:22

当问题被问及OpenCascademethod_missing 创建了一个新的每次查询 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

这就是模拟 cb 不起作用的原因...

此后已修复。

When the question was asked the implementation of OpenCascade's method_missing created a new object each time a Hash was queried:

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

This means that in that version the following:

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

That's why mocking c.b didn't work...

It has since been fixed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文