Parent

RSpec::Mocks::BaseExpectation

Attributes

error_generator[RW]
expected_from[W]
expected_received_count[W]
method_block[W]
sym[R]

Public Class Methods

new(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={}, &implementation) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 11
def initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count=1, opts={}, &implementation)
  @error_generator = error_generator
  @error_generator.opts = opts
  @expected_from = expected_from
  @sym = sym
  @method_block = method_block
  @return_block = nil
  @actual_received_count = 0
  @expected_received_count = expected_received_count
  @args_expectation = ArgumentExpectation.new(ArgumentMatchers::AnyArgsMatcher.new)
  @consecutive = false
  @exception_to_raise = nil
  @symbol_to_throw = nil
  @order_group = expectation_ordering
  @at_least = nil
  @at_most = nil
  @exactly = nil
  @args_to_yield = []
  @failed_fast = nil
  @args_to_yield_were_cloned = false
  @return_block = implementation
  @eval_context = nil
end

Public Instance Methods

and_raise() click to toggle source
and_raise(Exception) #any exception class
and_raise(exception) #any exception object

Warning

When you pass an exception class, the MessageExpectation will raise an instance of it, creating it with new. If the exception class initializer requires any parameters, you must pass in an instance and not the class.

# File lib/rspec/mocks/message_expectation.rb, line 77
def and_raise(exception=Exception)
  @exception_to_raise = exception
end
and_return(*values, &return_block) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 52
def and_return(*values, &return_block)
  Kernel::raise AmbiguousReturnError unless @method_block.nil?
  case values.size
    when 0 then value = nil
    when 1 then value = values[0]
  else
    value = values
    @consecutive = true
    @expected_received_count = values.size if !ignoring_args? &&
                                              @expected_received_count < values.size
  end
  @return_block = block_given? ? return_block : lambda { value }
end
and_throw(symbol) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 81
def and_throw(symbol)
  @symbol_to_throw = symbol
end
and_yield(*args, &block) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 85
def and_yield(*args, &block)
  if @args_to_yield_were_cloned
    @args_to_yield.clear
    @args_to_yield_were_cloned = false
  end
  
  if block
    @eval_context = Object.new
    @eval_context.extend RSpec::Mocks::InstanceExec
    yield @eval_context
  end
  
  @args_to_yield << args
  self
end
build_child(expected_from, method_block, expected_received_count, opts={}) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 35
def build_child(expected_from, method_block, expected_received_count, opts={})
  child = clone
  child.expected_from = expected_from
  child.method_block = method_block
  child.expected_received_count = expected_received_count
  child.clear_actual_received_count!
  new_gen = error_generator.clone
  new_gen.opts = opts
  child.error_generator = new_gen
  child.clone_args_to_yield(*@args_to_yield)
  child
end
called_max_times?() click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 138
def called_max_times?
  @expected_received_count != :any && @expected_received_count > 0 &&
    @actual_received_count >= @expected_received_count
end
expected_args() click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 48
def expected_args
  @args_expectation.args
end
invoke(*args, &block) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 105
def invoke(*args, &block)
  if @expected_received_count == 0
    @failed_fast = true
    @actual_received_count += 1
    @error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *args)
  end
  
  @order_group.handle_order_constraint self

  begin
    Kernel::raise @exception_to_raise unless @exception_to_raise.nil?
    Kernel::throw @symbol_to_throw unless @symbol_to_throw.nil?
    
    default_return_val = if !@method_block.nil?
                           invoke_method_block(*args, &block)
                         elsif !@args_to_yield.empty? || @eval_context
                           invoke_with_yield(&block)
                         else
                           nil
                         end
    
    if @consecutive
      invoke_consecutive_return_block(*args, &block)
    elsif @return_block
      invoke_return_block(*args, &block)
    else
      default_return_val
    end
  ensure
    @actual_received_count += 1
  end
end
matches?(sym, *args) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 101
def matches?(sym, *args)
  @sym == sym and @args_expectation.args_match?(*args)
end

Protected Instance Methods

clone_args_to_yield(*args) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 189
def clone_args_to_yield(*args)
  @args_to_yield = args.clone
  @args_to_yield_were_cloned = true
end
eval_block(*args, &block) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 167
def eval_block(*args, &block)
  if @eval_context
    @eval_context.instance_exec(*args, &block)
  else
    block.call(*args)
  end
end
failed_fast?() click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 194
def failed_fast?
  @failed_fast
end
invoke_consecutive_return_block(*args, &block) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 175
def invoke_consecutive_return_block(*args, &block)
  value = invoke_return_block(*args, &block)
  index = [@actual_received_count, value.size-1].min
  value[index]
end
invoke_method_block(*args, &block) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 145
def invoke_method_block(*args, &block)
  begin
    @method_block.call(*args, &block)
  rescue => detail
    @error_generator.raise_block_failed_error(@sym, detail.message)
  end
end
invoke_return_block(*args, &block) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 181
def invoke_return_block(*args, &block)
  args << block unless block.nil?
  # Ruby 1.9 - when we set @return_block to return values
  # regardless of arguments, any arguments will result in
  # a "wrong number of arguments" error
  @return_block.arity == 0 ? @return_block.call : @return_block.call(*args)
end
invoke_with_yield(&block) click to toggle source
# File lib/rspec/mocks/message_expectation.rb, line 153
def invoke_with_yield(&block)
  if block.nil?
    @error_generator.raise_missing_block_error @args_to_yield
  end
  value = nil
  @args_to_yield.each do |args_to_yield_this_time|
    if block.arity > -1 && args_to_yield_this_time.length != block.arity
      @error_generator.raise_wrong_arity_error args_to_yield_this_time, block.arity
    end
    value = eval_block(*args_to_yield_this_time, &block)
  end
  value
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.