如何從Ruby的內存中完全刪除一個類?如何在Ruby中重置類定義?
我有兩個文件,我的工作:
# foo.rb
require 'expensive_library'
class Foo < ExpensiveLibrary::Plugin
...
end
和:
# 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
ExpensiveLibrary是昂貴的;加載需要15秒以上。在開發過程中反覆運行測試的時間太長(測試套件的其餘部分時間不到1秒)。
我已經通過啓動Pry並編寫加載這兩個文件並調用Test::Unit:Autorunner.run
的函數來解決昂貴庫的加載時間問題。在測試的第一次運行中,這仍然有15秒的停頓,但後續的測試每次只需不到1秒鐘。
但是,這裏有兩個問題:
- 撬抱怨在Foo和Foo_tests被重新定義
- 當我從刪除源文件的方法有關的所有方法,但它仍然在我的測試環境中定義,產生虛假故障。
基於其他堆棧溢出的問題(如 「How to undefine class in Ruby?」),我已經打過電話Object.constants.remove(:Foo)
和Object.constants.remove(:Foo_tests)
。我不再重新定義錯誤的方法,但現在自動運行程序多次運行測試,包括刪除的測試。
我想要的是在不重新加載ExpensiveLibrary的情況下運行修改後的測試。定義測試類是我看到的方式,但我不知道如何。其他解決方案可能會更好。
感謝您的編輯。 – 2014-08-29 17:50:24