在 RSpec 中模拟一个 Set 匹配器

Mocking a Set matcher in RSpec

我有一个库,它使用以下表达式

检查对象是否是 class 的实例

ClassName === object

有没有什么方法可以编写一个 double 来模拟上面的表达式(我的 double 将替换表达式中的对象)returns true

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

然而,ClassName === object仍然是一个方法调用。所以你可以做的是在ClassName上添加===方法:

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

以上甚至适用于:

case object
when ClassName
  # ...
end

它只是调用 ClassName === object.