首页 > 解决方案 > 在 RSpec 中模拟集合匹配器

问题描述

我有一个库,它使用以下表达式检查对象是否是类的实例

ClassName === object

有没有办法编写一个double可以模拟这个的方法,这样上面的表达式(我的双精度将替换表达式中的对象)返回 true

标签: rubyrspec

解决方案


虽然ClassName === object等价于object.kind_of?(ClassName),但 Ruby 检查对象的类而不调用任何object' 方法。这意味着object在这种情况下不能做任何事情来被识别为ClassName实例,除非它实际上ClassName(或其子类/包含的模块之一)的实例。

然而,ClassName === object仍然是一个方法调用。所以你可以===做的就是将方法存根ClassName

allow(ClassName).to receive(:===).with(object).and_return(true)

以上甚至适用于:

case object
when ClassName
  # ...
end

它只是调用ClassName === object.


推荐阅读