Come posso rimuovere completamente una classe dalla memoria in Ruby?Come si ripristina una definizione di classe in Ruby?
Ho due file con cui sto lavorando:
# foo.rb
require 'expensive_library'
class Foo < ExpensiveLibrary::Plugin
...
end
e:
# 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 è costoso; ci vogliono più di 15 secondi per caricare. È troppo lungo per eseguire ripetutamente i test durante lo sviluppo (il resto della suite di test richiede meno di 1 secondo).
Ho lavorato intorno al tempo di caricamento della libreria costosa avviando Pry e scrivendo una funzione che carica i due file e chiama Test::Unit:Autorunner.run
. Questo ha ancora una pausa di 15 secondi nella prima esecuzione dei test, ma i successivi test durano meno di 1 secondo ciascuno.
Tuttavia, ci sono due problemi:
- leva lamenta tutti i metodi su Foo e Foo_tests essere ridefiniti
- quando rimuovo un metodo dal file di origine, rimane definita nel mio ambiente di prova, generando fallimenti spuri.
Sulla base di altre questioni Stack Overflow (come "How to undefine class in Ruby?"), ho provato a chiamare Object.constants.remove(:Foo)
e Object.constants.remove(:Foo_tests)
. Non riesco più a ottenere gli errori ridefiniti del metodo, ma ora l'autorunner esegue i test più volte, inclusi i test rimossi.
Quello che voglio è eseguire i test modificati senza ricaricare ExpensiveLibrary. L'indefinimento delle classi di test è il modo in cui vedo farlo, ma non so come. Altre soluzioni potrebbero essere migliori.
Grazie per la modifica. –