如何防止在Ruby中重写类?

时间:2019-05-23 13:58:33

标签: ruby minitest

我正在设置如何编写最小测试的规则,并且我想防止其他程序员重写现有类的方法,因为这会影响使用该类的其他测试。以下是一些说明。

例如,我在lib文件夹中有一个类, KlassExample 。它有一个具有自己逻辑的公共方法 do_something 。在最小测试中,有人可能想用其他逻辑覆盖此方法。如果类逻辑被重写,我不想允许运行测试。

代码示例:

lib / klass_example.rb

class KlassExample

  def do_something
    false
  end

end

test / unit / lib / klass_example_test.rb

require 'unit/test_helper'
require 'klass_example'

class KlassExample

  def do_something
    true
  end

end

class KlassExampleTest < Minitest::Test

  def test_do_something
    assert_equal true, KlassExample.new.do_something
  end

end

我希望程序员使用 MiniTest :: Mock 代替类重写,因此我需要采取强制措施,使他们以正确的方式编写代码。

有没有可能的复杂解决方案?

1 个答案:

答案 0 :(得分:3)

通过在类重新打开时设置TracePoint,例如,可以通过TracePoint#new(:class)在某种程度上覆盖Module#prepended。从那里开始,您将永远不会阻止 all 显式或隐式地内置到Ruby中的可能性,以确实 允许开发人员执行他们想要的任何事情。

覆盖Module#define_method的回调将不允许其他人将prepend模块添加到您的类中:

KlassExample.prepend(Module.new { def self.prepended(*); raise end })

有一些方法可以阻止{{3}}调用,而且它们已经看起来像黑客一样。

但是,几乎所有的可能性都可能使您的后卫蒙上无限的阴影,所以我怀疑这总体上是可行的。我敢打赌,每当您认为“好,现在一切都已涵盖”时,我很容易发明出另一种麻烦的方法来绕过所有警卫。

Ruby不是旨在防止开发人员执行他们想要做的事情的语言。