如何在Ruby中重置类定义?

Bla*_*cal 7 ruby

如何在Ruby中从内存中完全删除类?

我有两个我正在使用的文件:

# foo.rb
require 'expensive_library'

class Foo < ExpensiveLibrary::Plugin
   ...
end
Run Code Online (Sandbox Code Playgroud)

和:

# foo_tests.rb
require 'foo'
require 'test/unit'

class foo_tests < Test::Unit::TestCase
  def test_foo_meets_spec_1
    ...
  end
  def test_foo_meets_deprecated_spec
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

昂贵的图书馆很贵; 加载需要15秒以上.这在开发过程中反复运行测试的时间太长(测试套件的其余部分不到1秒).

我通过启动Pry并编写一个加载两个文件和调用的函数来解决昂贵库的加载时间问题Test::Unit:Autorunner.run.在第一次测试中,这仍然有15秒的暂停,但后续测试运行每次不到1秒.

但是,有两个问题:

  1. Pry抱怨重新定义了Foo和Foo_tests上的所有方法
  2. 当我从源文件中删除一个方法时,它仍然在我的测试环境中定义,产生虚假的失败.

根据其他Stack Overflow问题(如" 如何在Ruby中取消定义类? "),我试过调用Object.constants.remove(:Foo)和Object.constants.remove(:Foo_tests).我不再获得方法重新定义的错误,但现在自动运行器多次运行测试,包括删除测试.

我想要的是在不重新加载ExpensiveLibrary的情况下运行修改过的测试.取消定义测试类是我看到的方式,但我不知道如何.其他解决方案可能更好.

小智 0

好吧,只是在这里吐痰,因为我不确定你到底想做什么,但是你尝试过undef吗undef_method?它们不能直接在类上工作,但是如果您取消定义调用您不想完成的测试的方法,也许它会为您工作?