17

所以我很确定这会奏效......

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 。from().to()在 RSpec 中是否有一些特殊的方法可以做到这一点?

4

1 回答 1

19

这应该有效:

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)

我认为这是最易读的。

于 2012-12-01T00:58:17.163 回答