Enhetstesting av private metoder i Ruby
Enhetstesting av private metoder lar seg ikke gjøre helt uten videre, ettersom de per definisjon ikke er kjørbare utenfor klassen som testes. Takket være Rubys dynamikk er dette null problem med en liten hjelpe-metode.
Publiser metoder
Siden Ruby ikke har noe problem med å la deg åpne klasser når som helst kan vi lage en liten test-hjelper som legger til en metode på Object. Denne blir så tilgjengelig på alle objekter, og det den gjør er å
- Konvertere alle
privatemetoder tilpublic -
yieldkontroll til blokken som sendes med - Konvertere metodene tilbake til
private
Eksempel
def test_private_methods
MyClass.publicize_methods do
assert MyClass.some_private_method
end
end
Koden
Følgende er koden som må puttes i en fil som inkluderes til testene dine. Bruker du Rails så vil et naturlig sted være [RAILS_ROOT]/test/test_helper.rb (helt nederst i fila):
# Allow for testing of private methods inside a block:
#
# MyClass.publicize_methods do
# assert MyClass.some_private_method
# end
class Class
def publicize_methods
saved_private_instance_methods = self.private_instance_methods
self.class_eval { public *saved_private_instance_methods }
yield
self.class_eval { private *saved_private_instance_methods }
end
end
Det er selvfølgelig også mulig å kjøre de private metodene gjennom obj.send :privat_metode, men det føles litt mer som å bryte seg inn.
Og til slutt: kilden (som kommer via sin kilde osv...)