RSpec:多次预期消息但参数不同

man*_*ode 10 ruby rspec ruby-on-rails

我目前对连续调用的模拟设置了一些期望:

规格:

@my_mock = mock("a_mock")
@options1 = {:some => "option"}
@options2 = {:some_other => "option"}
@first_param = mock("first_param")

@my_mock.should_receive(:a_message).with(@first_param, @options1)
@my_mock.should_receive(:a_message).with(@first_param, @options2)
Run Code Online (Sandbox Code Playgroud)

但是,我得到以下内容:

Mock "a_mock" received :a_message with unexpected arguments
  expected: (#<Spec::Mocks::Mock:0x81b8ca3c @name="first_param"{:some => "option"})
   got: (#<Spec::Mocks::Mock:0x81b8ca3c @name="first_param">, {:some_other => "option"})
Run Code Online (Sandbox Code Playgroud)

当我调试它时,第一个期望被调用.在我可以预期具有相同消息但参数不同的连续呼叫之前,我是否必须指定其他任何内容?

Bal*_*ldu 10

尝试将mock作为null对象创建,以忽略额外的方法调用.您的每个期望仍然必须得到满足,但它们不会相互衔接.

@my_mock = mock("a_mock").as_null_object
Run Code Online (Sandbox Code Playgroud)

这遵循Null对象模式,其中任何无关的消息都被忽略.当您想要确保使用某些参数调用方法时,它对于模拟很有用,但是您不关心是否使用其他参数调用它或者是否调用任何其他方法.