Ответ 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)
который, по моему мнению, является наиболее читаемым.