如何在RSpec中检查Nil的变化

web*_*rts 12 ruby null rspec

所以我很确定这会起作用......

expect { file.send(:on_io) {} }.to change{
  file.io.class
}.from( NilClass ).to( File )
Run Code Online (Sandbox Code Playgroud)

但它失败了这条消息......

result should have initially been NilClass, but was NilClass
Run Code Online (Sandbox Code Playgroud)

胡?

首先,为什么这会以失败告终?其次,我通常知道您可以be_nil使用该nil?方法检查nil .from().to()在RSpec中有一些特殊的方法吗?

Jea*_*ano 13

这应该工作:

expect { file.send(:on_io) {} }.to change{
  file.io
}.from(NilClass).to(File)
Run Code Online (Sandbox Code Playgroud)

rspec的会用===比较的价值fromto.但是===不是可交换的,当在类上调用时,它将检查它的参数是否是类的实例.所以:

NilClass === NilClass
#=> false
Run Code Online (Sandbox Code Playgroud)

因为NilClass不是NilClass的实例.另一方面,

NilClass === nil
#=> true
nil === nil
#=> true
nil === NilClass
#=> false
Run Code Online (Sandbox Code Playgroud)

因为nil是NilClass的一个实例,所以nil等于nil,但是nil不等于NilClass.

您也可以这样编写测试:

expect { file.send(:on_io) {} }.to change{
  file.io
}.from(nil).to(File)
Run Code Online (Sandbox Code Playgroud)

我认为这是最具可读性的.