如何阻止RSpec匿名类泄漏?

所以我正在尝试测试抽象类。根据我所读的内容,给一个名为Foo的类,我可以在RSpec中执行以下操作,它不会泄漏到其他测试中。

let(:test) do
  Class.new(Foo) do
    # Do things here
  end
end

但是,当我在另一个位置执行Foo.subclasses时(根据规范的执行顺序),我仍然发现它仍然泄漏。

我还尝试以正常方式定义该类,并在after块中将其删除,例如

let(:test) do
  class Test < Foo; end
  Test
end
...

after do
  Object.send(:remove_const,:Test)
end

但这似乎也没有用。 Foo.subclasses似乎仍然包含匿名类。

aishine 回答:如何阻止RSpec匿名类泄漏?

我对subclasses的工作方式进行了调查,这就是我的发现(尽管并不是您问题的答案)

subclasses内部调用descendants(它们都来自ActiveSupport),而内部调用ObjectSpace.each_object

如果您阅读it's doc,它会说

  

ObjectSpace模块包含许多交互的例程   与垃圾收集设施,并允许您遍历所有   带有迭代器的生物。

这不是很清楚。但是AFAIU会迭代GC知道的所有对象。

因此,现实是这样的:除非您向GC询问此类,否则此类是无法访问的,那么它可以为您提供引用。 (如果您问我的话,这有点荒唐)

IMO,您不应该在任何生产代码上相信subclasses。似乎不可预测。也许,无论您想使用subclasses实现什么目标,都可以通过其他方式完成? (但这是另一个SO问题的主题)

本文链接:https://www.f2er.com/3106236.html

大家都在问