RSpec: 期望一个方法被调用导致该方法实际上没有被调用
RSpec: Expecting a method to be called causes that method to not actually be called
我有一些代码可以用非常简单的术语表示为:
def method_a(key)
hash = method b(key)
hash.delete(key)
end
def method_b(key)
return { key => 1 }
end
然后是 rspec 测试,例如
it 'calls method_b'
expect(someClass).to receive(:method_b).with(key)
method_a(key)
end
然而,我在 method_a 的第二行出现错误,因为它试图在 nil 对象上调用 delete
。当我调试时,我可以看到 method_b 中的逻辑实际上从未被调用过。它并没有在 method_b 中的某个地方失败,它根本就没有调用它。如果我去掉测试中的 expect
语句,这个错误就会消失。似乎 expect 语句导致它跳过对 method_b 的实际调用,给我留下一个 nil 值而不是我期望的哈希值。
有什么方法可以阻止它跳过 method_b,或者至少在 expect 语句成功后终止执行,这样我就不会 运行 进入下一个错误线?
当您设置消息预期时,它会覆盖原始代码,除非您明确告诉 RSpec 不要:
expect(someClass).to receive(:method_b).with(key).and_call_original
我有一些代码可以用非常简单的术语表示为:
def method_a(key)
hash = method b(key)
hash.delete(key)
end
def method_b(key)
return { key => 1 }
end
然后是 rspec 测试,例如
it 'calls method_b'
expect(someClass).to receive(:method_b).with(key)
method_a(key)
end
然而,我在 method_a 的第二行出现错误,因为它试图在 nil 对象上调用 delete
。当我调试时,我可以看到 method_b 中的逻辑实际上从未被调用过。它并没有在 method_b 中的某个地方失败,它根本就没有调用它。如果我去掉测试中的 expect
语句,这个错误就会消失。似乎 expect 语句导致它跳过对 method_b 的实际调用,给我留下一个 nil 值而不是我期望的哈希值。
有什么方法可以阻止它跳过 method_b,或者至少在 expect 语句成功后终止执行,这样我就不会 运行 进入下一个错误线?
当您设置消息预期时,它会覆盖原始代码,除非您明确告诉 RSpec 不要:
expect(someClass).to receive(:method_b).with(key).and_call_original