Class: Spec::Mocks::BaseExpectation

Inherits:
Object
  • Object
show all
Defined in:
lib/spec/mocks/message_expectation.rb

Direct Known Subclasses

MessageExpectation

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(error_generator, expectation_ordering, expected_from, sym, method_block, expected_received_count = 1, opts = {}, &implementation) ⇒ BaseExpectation

Returns a new instance of BaseExpectation.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/spec/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
  @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
  @args_to_yield = []
  @failed_fast = nil
  @args_to_yield_were_cloned = false
  @return_block = implementation
  @eval_context = nil
end

Instance Attribute Details

#symObject (readonly)

Returns the value of attribute sym.



5
6
7
# File 'lib/spec/mocks/message_expectation.rb', line 5

def sym
  @sym
end

Instance Method Details

#and_raise(exception = Exception) ⇒ Object

:call-seq:

and_raise()
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.



75
76
77
# File 'lib/spec/mocks/message_expectation.rb', line 75

def and_raise(exception=Exception)
  @exception_to_raise = exception
end

#and_return(*values, &return_block) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/spec/mocks/message_expectation.rb', line 50

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) ⇒ Object



79
80
81
# File 'lib/spec/mocks/message_expectation.rb', line 79

def and_throw(symbol)
  @symbol_to_throw = symbol
end

#and_yield(*args, &block) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/spec/mocks/message_expectation.rb', line 83

def and_yield(*args, &block)
  if @args_to_yield_were_cloned
    @args_to_yield.clear
    @args_to_yield_were_cloned = false
  end

  if block
    require 'spec/extensions/instance_exec'
    @eval_context = Object.new
    @eval_context.extend Spec::Matchers::InstanceExec
    yield @eval_context
  end
  @args_to_yield << args
  self
end

#build_child(expected_from, method_block, expected_received_count, opts = {}) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/spec/mocks/message_expectation.rb', line 33

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?Boolean

Returns:

  • (Boolean)


137
138
139
140
# File 'lib/spec/mocks/message_expectation.rb', line 137

def called_max_times?
  @expected_received_count != :any && @expected_received_count > 0 &&
    @actual_received_count >= @expected_received_count
end

#expected_argsObject



46
47
48
# File 'lib/spec/mocks/message_expectation.rb', line 46

def expected_args
  @args_expectation.args
end

#invoke(*args, &block) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/spec/mocks/message_expectation.rb', line 103

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?


    if !@method_block.nil?
      default_return_val = invoke_method_block(*args)
    elsif @args_to_yield.size > 0 || @eval_context
      default_return_val = invoke_with_yield(&block)
    else
      default_return_val = nil
    end

    if @consecutive
      return invoke_consecutive_return_block(*args, &block)
    elsif @return_block
      return invoke_return_block(*args, &block)
    else
      return default_return_val
    end
  ensure
    @actual_received_count += 1
  end
end

#invoke_return_block(*args, &block) ⇒ Object



142
143
144
145
146
147
148
# File 'lib/spec/mocks/message_expectation.rb', line 142

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

#matches(sym, args) ⇒ Object



99
100
101
# File 'lib/spec/mocks/message_expectation.rb', line 99

def matches(sym, args)
  @sym == sym and @args_expectation.args_match?(args)
end