def __mock_dispatch_spy
      @stub.__mock_disps.values.flatten.each do |disp|
        next unless __mock_defis.key?(disp.msg) # ignore undefined spies

        defis = __mock_defis[disp.msg]
        if idx = __mock_find_checked_difi(defis, disp.args, :index)
          __mock_disps_push(defis.delete_at(idx)) # found, dispatch it
        elsif defis.empty? # show called candidates
          __mock_failed(disp.msg, disp.args)
        else # show expected candidates
          __mock_failed(disp.msg, disp.args, defis)
        end
      end
    end
def __mock_dispatch_spy
      @stub.__mock_disps.values.flatten.each do |disp|
        next unless __mock_defis.key?(disp.msg) # ignore undefined spies

        defis = __mock_defis[disp.msg]
        if idx = __mock_find_checked_difi(defis, disp.args, :index)
          __mock_disps_push(defis.delete_at(idx)) # found, dispatch it
        elsif defis.empty? # show called candidates
          __mock_failed(disp.msg, disp.args)
        else # show expected candidates
          __mock_failed(disp.msg, disp.args, defis)
        end
      end
    end
spies don't leave any track
 simulate dispatching before passing to mock to verify