Hopp til innholdet

cjohansen.no

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 å

  1. Konvertere alle private metoder til public
  2. yield kontroll til blokken som sendes med
  3. 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...)

Muligens relatert

2006 - 2012 Christian Johansen Creative Commons Lisens