我创建了一个 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..但有什么办法可以解决这个问题吗?

有帮助吗?

解决方案

找出答案是使用迄今为止 无证参数匹配器 hash_including 很像我的第一条评论

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

这很好用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top