Class: Mocha::Expectation
- Inherits:
-
Object
- Object
- Mocha::Expectation
- Defined in:
- lib/mocha/expectation.rb
Overview
Methods on expectations returned from Mock#expects, Mock#stubs, ObjectMethods#expects and ObjectMethods#stubs.
Instance Method Summary collapse
-
#at_least(minimum_number_of_times) ⇒ Expectation
Modifies expectation so that the expected method must be called at least a
minimum_number_of_times
. -
#at_least_once ⇒ Expectation
Modifies expectation so that the expected method must be called at least once.
-
#at_most(maximum_number_of_times) ⇒ Expectation
Modifies expectation so that the expected method must be called at most a
maximum_number_of_times
. -
#at_most_once ⇒ Expectation
Modifies expectation so that the expected method must be called at most once.
-
#in_sequence(sequence, *sequences) ⇒ Expectation
Constrains the expectation so that it must be invoked at the current point in the
sequence
. -
#multiple_yields(*parameter_groups) ⇒ Expectation
Modifies expectation so that when the expected method is called, it yields multiple times per invocation with the specified
parameter_groups
. -
#never ⇒ Expectation
Modifies expectation so that the expected method must never be called.
-
#once ⇒ Expectation
Modifies expectation so that the expected method must be called exactly once.
-
#raises(exception = RuntimeError, message = nil) ⇒ Expectation
Modifies expectation so that when the expected method is called, it raises the specified
exception
with the specifiedmessage
i.e. -
#returns(*values) ⇒ Expectation
Modifies expectation so that when the expected method is called, it returns the specified
value
. -
#then(state = nil) ⇒ Expectation
The same expectation, thereby allowing invocations of other Expectation methods to be chained.
-
#thrice ⇒ Expectation
Modifies expectation so that the expected method must be called exactly three times.
-
#throws(tag, object = nil) ⇒ Expectation
Modifies expectation so that when the expected method is called, it throws the specified
tag
with the specific return valueobject
i.e. -
#times(range_or_number) ⇒ Expectation
Modifies expectation so that the number of invocations of the expected method must be within a specified range or exactly equal to a specified number.
-
#twice ⇒ Expectation
Modifies expectation so that the expected method must be called exactly twice.
-
#when(state_predicate) ⇒ Expectation
Constrains the expectation to occur only when the
state_machine
is in the state specified bystate_predicate
. -
#with(*expected_parameters_or_matchers) {|actual_parameters| ... } ⇒ Expectation
Modifies expectation so that the expected method must be called with
expected_parameters_or_matchers
. -
#with_block_given ⇒ Expectation
Modifies expectation so that the expected method must be called with a block.
-
#with_no_block_given ⇒ Expectation
Modifies expectation so that the expected method must be called without a block.
-
#yields(*parameters) ⇒ Expectation
Modifies expectation so that when the expected method is called, it yields to the block with the specified
parameters
.
Instance Method Details
#at_least(minimum_number_of_times) ⇒ Expectation
Modifies expectation so that the expected method must be called at least a minimum_number_of_times
.
164 165 166 167 |
# File 'lib/mocha/expectation.rb', line 164 def at_least(minimum_number_of_times) @cardinality.at_least(minimum_number_of_times) self end |
#at_least_once ⇒ Expectation
Modifies expectation so that the expected method must be called at least once. This is equivalent to calling #at_least with an argument of 1
.
182 183 184 |
# File 'lib/mocha/expectation.rb', line 182 def at_least_once at_least(1) end |
#at_most(maximum_number_of_times) ⇒ Expectation
Modifies expectation so that the expected method must be called at most a maximum_number_of_times
.
200 201 202 203 |
# File 'lib/mocha/expectation.rb', line 200 def at_most(maximum_number_of_times) @cardinality.at_most(maximum_number_of_times) self end |
#at_most_once ⇒ Expectation
Modifies expectation so that the expected method must be called at most once. This is equivalent to calling #at_most with an argument of 1
.
218 219 220 |
# File 'lib/mocha/expectation.rb', line 218 def at_most_once at_most(1) end |
#in_sequence(sequence, *sequences) ⇒ Expectation
Constrains the expectation so that it must be invoked at the current point in the sequence
.
To expect a sequence of invocations, write the expectations in order and add the in_sequence(sequence) clause to each one.
Expectations in a sequence
can have any invocation count.
If an expectation in a sequence is stubbed, rather than expected, it can be skipped in the sequence
.
An expected method can appear in multiple sequences.
643 644 645 646 |
# File 'lib/mocha/expectation.rb', line 643 def in_sequence(sequence, *sequences) sequences.unshift(sequence).each { |seq| add_in_sequence_ordering_constraint(seq) } self end |
#multiple_yields(*parameter_groups) ⇒ Expectation
Modifies expectation so that when the expected method is called, it yields multiple times per invocation with the specified parameter_groups
.
If no block is provided, the method will still attempt to yield resulting in a LocalJumpError
. Note that this is what would happen if a “real” (non-mock) method implementation tried to yield to a non-existent block.
430 431 432 433 |
# File 'lib/mocha/expectation.rb', line 430 def multiple_yields(*parameter_groups) @yield_parameters.add(*parameter_groups) self end |
#never ⇒ Expectation
Modifies expectation so that the expected method must never be called.
144 145 146 147 |
# File 'lib/mocha/expectation.rb', line 144 def never @cardinality.exactly(0) self end |
#once ⇒ Expectation
Modifies expectation so that the expected method must be called exactly once. This is equivalent to calling #times with an argument of 1
.
Note that this is the default behaviour for an expectation, but you may wish to use it for clarity/emphasis.
127 128 129 130 |
# File 'lib/mocha/expectation.rb', line 127 def once @cardinality.exactly(1) self end |
#raises ⇒ Expectation #raises(exception) ⇒ Expectation #raises(exception, message) ⇒ Expectation
Modifies expectation so that when the expected method is called, it raises the specified exception
with the specified message
i.e. calls Kernel#raise(exception, message).
517 518 519 520 |
# File 'lib/mocha/expectation.rb', line 517 def raises(exception = RuntimeError, = nil) @return_values += ReturnValues.new(ExceptionRaiser.new(exception, )) self end |
#returns(value) ⇒ Expectation #returns(*values) ⇒ Expectation
Modifies expectation so that when the expected method is called, it returns the specified value
.
477 478 479 480 |
# File 'lib/mocha/expectation.rb', line 477 def returns(*values) @return_values += ReturnValues.build(*values) self end |
#then ⇒ Expectation #then(state) ⇒ Expectation
Returns the same expectation, thereby allowing invocations of other Mocha::Expectation methods to be chained.
591 592 593 594 |
# File 'lib/mocha/expectation.rb', line 591 def then(state = nil) add_side_effect(ChangeStateSideEffect.new(state)) if state self end |
#thrice ⇒ Expectation
Modifies expectation so that the expected method must be called exactly three times. This is equivalent to calling #times with an argument of 3
.
76 77 78 79 |
# File 'lib/mocha/expectation.rb', line 76 def thrice @cardinality.exactly(3) self end |
#throw(tag) ⇒ Expectation #throw(tag, object) ⇒ Expectation
Modifies expectation so that when the expected method is called, it throws the specified tag
with the specific return value object
i.e. calls Kernel#throw(tag, object).
556 557 558 559 |
# File 'lib/mocha/expectation.rb', line 556 def throws(tag, object = nil) @return_values += ReturnValues.new(Thrower.new(tag, object)) self end |
#times(range_or_number) ⇒ Expectation
Modifies expectation so that the number of invocations of the expected method must be within a specified range or exactly equal to a specified number.
47 48 49 50 |
# File 'lib/mocha/expectation.rb', line 47 def times(range_or_number) @cardinality.times(range_or_number) self end |
#twice ⇒ Expectation
Modifies expectation so that the expected method must be called exactly twice. This is equivalent to calling #times with an argument of 2
.
102 103 104 105 |
# File 'lib/mocha/expectation.rb', line 102 def twice @cardinality.exactly(2) self end |
#when(state_predicate) ⇒ Expectation
Constrains the expectation to occur only when the state_machine
is in the state specified by state_predicate
.
615 616 617 618 |
# File 'lib/mocha/expectation.rb', line 615 def when(state_predicate) add_ordering_constraint(InStateOrderingConstraint.new(state_predicate)) self end |
#with(*expected_parameters_or_matchers) {|actual_parameters| ... } ⇒ Expectation
Modifies expectation so that the expected method must be called with expected_parameters_or_matchers
.
May be used with Ruby literals or variables for exact matching or with parameter matchers for less-specific matching, e.g. ParameterMatchers#includes, ParameterMatchers#has_key, etc. See ParameterMatchers for a list of all available parameter matchers.
Alternatively a block argument can be passed to #with to implement custom parameter matching. The block receives the *actual_parameters as its arguments and should return true
if they are acceptable or false
otherwise. See the example below where a method is expected to be called with a value divisible by 4. The block argument takes precedence over expected_parameters_or_matchers
. The block may be called multiple times per invocation of the expected method and so it should be idempotent.
Note that if #with is called multiple times on the same expectation, the last call takes precedence; other calls are ignored.
Positional arguments were separated from keyword arguments in Ruby v3 (see this article). In relation to this a new configuration option (Configuration#strict_keyword_argument_matching=) is available in Ruby >= 2.7.
When Configuration#strict_keyword_argument_matching= is set to false
(which is the default in Ruby v2.7), a positional Hash
and a set of keyword arguments passed to #with are treated the same for the purposes of parameter matching. However, a deprecation warning will be displayed if a positional Hash
matches a set of keyword arguments or vice versa.
When Configuration#strict_keyword_argument_matching= is set to true
(which is the default in Ruby >= v3.0), an actual positional Hash
will not match an expected set of keyword arguments; and vice versa, an actual set of keyword arguments will not match an expected positional Hash
, i.e. the parameter matching is stricter.
324 325 326 327 |
# File 'lib/mocha/expectation.rb', line 324 def with(*expected_parameters_or_matchers, &matching_block) @parameters_matcher = ParametersMatcher.new(expected_parameters_or_matchers, self, &matching_block) self end |
#with_block_given ⇒ Expectation
Modifies expectation so that the expected method must be called with a block.
344 345 346 347 |
# File 'lib/mocha/expectation.rb', line 344 def with_block_given @block_matcher = BlockMatchers::BlockGiven.new self end |
#with_no_block_given ⇒ Expectation
Modifies expectation so that the expected method must be called without a block.
363 364 365 366 |
# File 'lib/mocha/expectation.rb', line 363 def with_no_block_given @block_matcher = BlockMatchers::NoBlockGiven.new self end |
#yields(*parameters) ⇒ Expectation
Modifies expectation so that when the expected method is called, it yields to the block with the specified parameters
.
If no parameters
are specified, it yields to the block without any parameters.
If no block is provided, the method will still attempt to yield resulting in a LocalJumpError
. Note that this is what would happen if a “real” (non-mock) method implementation tried to yield to a non-existent block.
May be called multiple times on the same expectation for consecutive invocations.
402 403 404 |
# File 'lib/mocha/expectation.rb', line 402 def yields(*parameters) multiple_yields(parameters) end |