Aaron Fischer Ingenieur, Vater, Heimwerker, Problemlöser

12 Dezember, 2006

Assertions in Ruby

Programmiersprachen

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 außerhalb 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 irgendwo 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.