В методе, вызываемом в double, ожидания относительно аргумента
Вопрос
Я создал 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))
Это прекрасно работает.