17 Stimmen

Wie man mit RSpec auf eine Änderung von Nil überprüft

Also war ich mir ziemlich sicher, dass das funktionieren würde...

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

aber es schlägt mit dieser Meldung fehl...

result sollte ursprünglich NilClass gewesen sein, war jedoch NilClass

Hu?

Erstens, warum wird dies als Fehler zurückgegeben? Zweitens, ich weiß normalerweise kann man nach nil mit be_nil über die nil? Methode prüfen. Gibt es eine besondere Möglichkeit, dies mit einem from().to() in RSpec zu tun?

19voto

Jean-Louis Giordano Punkte 1937

Dies sollte funktionieren:

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

rspec wird === nutzen, um den Wert in from und to zu vergleichen. Aber === ist nicht kommutativ, und wenn es auf eine Klasse aufgerufen wird, überprüft es, ob das Argument eine Instanz der Klasse ist. Also:

NilClass === NilClass
#=> false

Weil NilClass keine Instanz von NilClass ist. Andererseits,

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

Weil nil eine Instanz von NilClass ist, nil ist gleich nil, aber nil ist nicht gleich NilClass.

Sie könnten Ihren Test auch so schreiben:

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

was meiner Meinung nach am lesbarsten ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X