В методе, вызываемом в double, ожидания относительно аргумента

StackOverflow https://stackoverflow.com//questions/25010425

  •  20-12-2019
  •  | 
  •  

Вопрос

Я создал 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 определите поведение double, поэтому я не хочу помещать return в нижнюю часть expect..но есть ли какой-нибудь способ обойти это?

Это было полезно?

Решение

Выяснил, что ответ заключается в использовании пока средство сопоставления недокументированных аргументов hash_including очень похоже на мой первый комментарий

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

Это прекрасно работает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top