Assertions in Ruby

vom 12. December 2006

Ich habe heute versucht, asserts unter Ruby zu nutzen, leider hab ich nirgends eine entsprechende Funktion dazu gefunden (natürlich bis auf die assert-Methoden bei den UnitTest, die man aber ausserhalb einer TestSuite nicht nutzen kann). Also schnell (mit etwas Hilfe) selbst was gebastelt:

Eine neue Exception von der Standard-Exception ableiten

class AssertionFailure < StandardError
end

... und die Klasse Object um eine weitere Methode erweitern (in Ruby ist alles ein Objekt, auch die primitiven Datentypen. So hat man die assert-Methode überall verfügbar):

class Object
  def assert
    raise AssertionFailure.new unless yield if DEBUG
  end
end

Die Konstante DEBUG muss man natürlich irgend wo auf true setzen, damit die asserts ziehen. Ein kleines Beispiel (aus der heutigen SEKS-Vorlesung):

class NewMath
  def sqrt(number)
    assert {number >= 0} #pre-condition

    # ...

    res = Math.sqrt(number) 
    assert {res >= 0} #post-conditions
    assert {res*res == number}
    res
  end
end

Und nun ein Test:

DEBUG = true
a = NewMath.new
puts a.sqrt(-1)

Hier wird nun eine AssertionFailure Exception geworfen.

Unter Java ist die assert-Funktionalität bereits drin, muss aber mit dem Schalter -ea erst aktiviert werden.

delicious bookmark del.icio.us,


Kommentar schreiben