如何在RSpec中检查Nil的变化

时间:2012-11-30 23:21:06

标签: ruby rspec null

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

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

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

result should have initially been NilClass, but was NilClass

胡?

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

1 个答案:

答案 0 :(得分:13)

这应该有效:

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

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

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)

我认为最具可读性。