在rspec(1.2.9)中,指定对象每次都会接收多次调用方法的正确方法是什么?
我问因为这个令人困惑的结果:
describe Object do
it "passes, as expected" do
foo = mock('foo')
foo.should_receive(:bar).once.ordered.with(1)
foo.should_receive(:bar).once.ordered.with(2)
foo.bar(1)
foo.bar(2)
end
it "fails, as expected" do
foo = mock('foo')
foo.should_receive(:bar).once.ordered.with(1) # => Mock "foo" expected :bar with (1) once, but received it twice
foo.should_receive(:bar).once.ordered.with(2)
foo.bar(1)
foo.bar(1)
foo.bar(2)
end
it "fails, as expected" do
foo = mock('foo')
foo.should_receive(:bar).once.ordered.with(1)
foo.should_receive(:bar).once.ordered.with(2)
foo.bar(2) # => Mock "foo" received :bar out of order
foo.bar(1)
end
it "fails, as expected, but with an unexpected message" do
foo = mock('foo')
foo.should_receive(:bar).once.ordered.with(1)
foo.should_receive(:bar).once.ordered.with(2)
foo.bar(1)
foo.bar(999) # => Mock "foo" received :bar with unexpected arguments
# => expected: (1)
# => got (999)
end
end
我预计最后一条失败消息是“预期的:(2)”,而不是“预期的(1)”。我是否错误地使用了rspec?
答案 0 :(得分:34)
与此question相似。建议的解决方案是调用as_null_object
以避免混淆消息。所以:
describe Object do
it "fails, as expected, (using null object)" do
foo = mock('foo').as_null_object
foo.should_receive(:bar).once.ordered.with(1)
foo.should_receive(:bar).once.ordered.with(2)
foo.bar(1)
foo.bar(999) # => Mock "foo" expected :bar with (2) once, but received it 0 times
end
end
输出与第二种情况不同(即“预期2但得到999”),但确实显示未达到预期。