2012-11-30 4 views
10

Also ich ziemlich sicher war, zu prüfen, diese ...Wie für einen Wechsel von Nil in RSpec

expect { file.send(:on_io) {} }.to change{ 
    file.io.class 
}.from(NilClass).to(File) 

aber es funktioniert nicht mit dieser Nachricht ...

result should have initially been NilClass, but was NilClass 

funktionieren würden Hu?

Zunächst einmal, warum kommt das als Fehler zurück? Zweitens, ich weiß normalerweise, dass Sie mit der nil? Methode be_nil auf Null überprüfen können. Gibt es eine spezielle Möglichkeit, dies mit einem from().to() in RSpec zu tun?

Antwort

11

sollte diese Arbeit:

expect { file.send(:on_io) {} }.to change{ 
    file.io 
}.from(NilClass).to(File) 

rspec === verwendet den Wert in from und to zu vergleichen. Aber === ist nicht kommutativ, und beim Aufruf einer Klasse wird überprüft, ob das Argument eine Instanz der Klasse ist. Also:

NilClass === NilClass 
#=> false 

Weil NilClass keine Instanz von NilClass ist. Auf der anderen Seite,

NilClass === nil 
#=> true 
nil === nil 
#=> true 
nil === NilClass 
#=> false 

Da nil eine Instanz von NilClass ist, ist gleich Null zu Null gleich, aber gleich Null ist NilClass nicht gleich.

Sie können auch Ihre Test auf diese Weise schreiben:

expect { file.send(:on_io) {} }.to change{ 
    file.io 
}.from(nil).to(File) 

, die ich denke, die meisten lesbar ist.

+0

Wenn 'nil === NilClass' false zurückgibt, würde' file.io === File' nicht auch false zurückgeben (unter der Annahme, dass 'file.io' eine Instanz von' File' ist)? – webdesserts

+1

Aber der Test wird 'File === file.io', das ist der ganze Punkt :) –

+1

Ahh ok, die Argumente in' to' und 'from' werden mit dem zurückgegebenen Wert verglichen und nicht umgekehrt. Macht Sinn. Danke das alles alles gut erklärt! – webdesserts

Verwandte Themen