RSpec:每次指定对具有不同参数的方法的多次调用

Way*_*rad 37 ruby testing rspec

在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
Run Code Online (Sandbox Code Playgroud)

我预计最后一条失败消息是"预期的:(2)",而不是"预期的(1)".我是否错误地使用了rspec?

zet*_*tic 34

与此问题类似.建议的解决方案是调用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
Run Code Online (Sandbox Code Playgroud)

输出与第二种情况不同(即"预期2但得到999"),但确实表明未达到预期.