我正在设置如何编写最小测试的规则,并且我想防止其他程序员重写现有类的方法,因为这会影响使用该类的其他测试。以下是一些说明。
例如,我在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 代替类重写,因此我需要采取强制措施,使他们以正确的方式编写代码。
有没有可能的复杂解决方案?
答案 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不是旨在防止开发人员执行他们想要做的事情的语言。