في الأسلوب الذي يسمى بالتوقعات المزدوجة حول الحجة
سؤال
لقد قمت بإنشاء مزدوج، وأقوم بتنفيذ تعليمات برمجية ستستدعيه بطريقة وتجزئة ضخمة كوسيطة، وأريد التحقق من مفتاح واحد للوسيطة، ثم إرجاع تجزئة محددة.
هذا ما أفعله
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
block، ولكن في المكالمات اللاحقة (التي تم اختبارها في الاختبار) يتم إرجاعها بشكل صحيح {stuff: 42}
ولكن بما أن المكالمة الأولى كانت خاطئة، فإن طريقتي تستثنى عندما تحاول الاتصال[:stuff]
على العودة.
أحاول السماح allow
حدد سلوك المضاعفة لذلك لا أريد أن أضع العائد في الجزء السفلي من expect
..ولكن هل هناك أي طريقة حول هذا الموضوع؟
المحلول
أحسب أن الجواب هو استخدام حتى الآن مُطابق الوسيطة غير الموثقة hash_including
يشبه إلى حد كبير تعليقي الأول
expect(@my_double).to receive(:do_stuff).with(hash_including(my_arg: 3))
هذا يعمل بشكل جيد.
لا تنتمي إلى StackOverflow