Ich habe eine Funktion, die einen Block akzeptiert, öffnet eine Datei, die Erträge und Renditen:Wie eine Funktion zu testen, die einen Block mit rspec nimmt
def start &block
.....do some stuff
File.open("filename", "w") do |f|
f.write("something")
....do some more stuff
yield
end
end
Ich versuche, einen Test zu schreiben, für die es rspec mit . Wie stosse ich File.open, so dass es ein Objekt f (von mir geliefert) an den Block übergeben, anstatt zu versuchen, eine tatsächliche Datei zu öffnen? Etwas wie:
it "should test something" do
myobject = double("File", {'write' => true})
File.should_receive(:open).with(&blk) do |myobject|
f.should_receive(:write)
blk.should_receive(:yield) (or somethig like that)
end
end
Es ist schwierig, dies zu testen, da das, was Sie testen möchten, intern in der Methode ist. Wie interagiert Ihre Datei mit etwas außerhalb der Methode? In Ihrem Beispiel verwenden Sie die Datei nicht außerhalb der Methode, und Sie erhalten sie auch nicht. Wenn etwas außerhalb dieser Funktion die Datei benötigt, sollten Sie vielleicht erwägen, das Dateiobjekt an die Methode zu übergeben (Dependency-Injektion). Dann kannst du der Datei kein Problem machen. Wenn Sie etwas über diese Datei testen müssen, sollten Sie vielleicht überlegen, sie in eine separate Methode aufzuteilen? – Raj
Danke ... tat so etwas, in mehrere Methoden aufgeteilt, stubed einige Funktionen wie File.stub (open) .and_yield (my_double), etc. – constantine1