Как проверить изменение с Nil в RSpec

Поэтому я был уверен, что это сработает...

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

но с этим сообщением не получается...

result should have initially been NilClass, but was NilClass

Х?

Во-первых, почему это возвращается как сбой? Во-вторых, я знаю, что вы можете проверить nil с помощью be_nil с помощью метода nil?. Есть ли специальный способ сделать это с помощью from().to() в RSpec?

Ответ 1

Это должно работать:

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

rspec будет использовать === для сравнения значения в from и to. Но === не является коммутативным, и при вызове класса он проверяет, является ли его аргумент экземпляром класса. Итак:

NilClass === NilClass
#=> false

Поскольку NilClass не является экземпляром NilClass. С другой стороны,

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

Поскольку nil является экземпляром NilClass, nil равно nil, но nil не равно NilClass.

Вы также можете написать свой тест следующим образом:

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

который, по моему мнению, является наиболее читаемым.