Ich bin ein Java-Entwickler, der mit Ruby herumspielt, und ich liebe es. Ich habe verstanden, dass meine Unit-Tests dank der Metaprogrammiermöglichkeiten von Ruby viel sauberer werden und ich keine lästigen Mocking-Frameworks brauche. Ich habe eine Klasse, die die File
Klasse und in meinem Test möchte ich mein echtes Dateisystem nicht berühren. In Java würde ich ein virtuelles Dateisystem für einfachere "Nähte" verwenden, um Fake-Objekte zu übergeben, aber in Ruby ist das offensichtlich ein Overkill. Was ich mir ausgedacht habe, sieht im Vergleich zur Java-Welt schon sehr gut aus. In meiner zu testenden Klasse habe ich einen optionalen Konstruktorparameter:
def initialize(file_class=File)
Wenn ich in meiner Klasse Dateien öffnen muss, kann ich dies dann tun:
@file_class.open(filename)
Und der Aufruf geht entweder an die echte File-Klasse, oder im Falle meines Unit-Tests an eine Fake-Klasse, die das Dateisystem nicht berührt. Ich weiß, es muss ein besserer Weg, dies mit Metaprogrammierung zu tun sein?