关于double的方法,对参数的期望

时间:2014-07-29 07:42:59

标签: ruby testing rspec rspec3

我创建了一个double,我正在执行代码,它将使用方法和一个巨大的哈希作为参数调用它,我想验证参数的一个键,然后返回一个特定的哈希值。

这就是我正在做的事情

before :each do
  allow(@my_double).to receive(:do_stuff).and_return({stuff: 42})
end
it "can do stuff" do
  expect(@my_double).to receive(:do_stuff) do  |arg|
    expect(arg).to be_a(Hash)
    expect(arg[:my_arg]).to eq(3)
  end
  TestObject.stuff() # will invoke do_stuff on the double
end

发生的情况是,第一次调用do_stuff时,它返回true这是receive块的结果,但是在后续调用(在pry中测试)中它正确返回{stuff: 42}但由于第一次调用错误,我的方法在尝试在返回时调用[:stuff]时会异常。

我想让allow定义双重行为,所以我不想把回报放在expect的底部......但是有什么方法可以解决它?

1 个答案:

答案 0 :(得分:0)

想出答案是使用与我的第一条评论非常相似的undocumented argument matcher hash_including

expect(@my_double).to receive(:do_stuff).with(hash_including(my_arg: 3))

这很好用。