If you stub a method or set expectations with should_receive these stubbed methods may also yield blocks. This is handy if the returning object is receiving a block call.
Consider this, where you cannot say and_return [] because of the block:
def crawl_messages
  Message.find_in_batches do |messages|
    messages.each(&:crawl)
  end
end
It works similar to and_return -- just use 
  and_yield
  
    Show archive.org snapshot
  
:
describe '#crawl_messages' do
  it 'should process messages in batches so the server stays alive' do
    message = stub
    message.should_receive(:crawl)
    Message.should_receive(:find_in_batches).and_yield([message])
    subject.crawl_messages
  end
end
You can also combine and_yield with and_return. Mind the order:
item = stub('a block')
subject.should_receive(:something).and_yield(item).and_return 'result'
Yielding multiple times
You can even chain multiple and_yield statements to yield the block multiple times with different arguments:
subject.should_receive(:something).and_yield(item1).and_yield(item2)
Posted by Arne Hartherz to makandra dev (2011-07-04 13:50)