mocha 1.10.2 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.yardopts +1 -0
- data/RELEASE.md +18 -0
- data/Rakefile +1 -4
- data/docs/Mocha.html +2 -2
- data/docs/Mocha/API.html +2 -2
- data/docs/Mocha/ClassMethods.html +2 -2
- data/docs/Mocha/Configuration.html +2 -2
- data/docs/Mocha/Expectation.html +284 -76
- data/docs/Mocha/ExpectationError.html +2 -2
- data/docs/Mocha/ExpectationErrorFactory.html +2 -2
- data/docs/Mocha/Hooks.html +2 -2
- data/docs/Mocha/Integration.html +2 -2
- data/docs/Mocha/Integration/MiniTest.html +2 -2
- data/docs/Mocha/Integration/MiniTest/Adapter.html +2 -2
- data/docs/Mocha/Integration/TestUnit.html +2 -2
- data/docs/Mocha/Integration/TestUnit/Adapter.html +2 -2
- data/docs/Mocha/Mock.html +2 -2
- data/docs/Mocha/ObjectMethods.html +2 -2
- data/docs/Mocha/ParameterMatchers.html +2 -2
- data/docs/Mocha/ParameterMatchers/AllOf.html +2 -2
- data/docs/Mocha/ParameterMatchers/AnyOf.html +2 -2
- data/docs/Mocha/ParameterMatchers/AnyParameters.html +2 -2
- data/docs/Mocha/ParameterMatchers/Anything.html +2 -2
- data/docs/Mocha/ParameterMatchers/Base.html +2 -2
- data/docs/Mocha/ParameterMatchers/Equals.html +2 -2
- data/docs/Mocha/ParameterMatchers/EquivalentUri.html +2 -2
- data/docs/Mocha/ParameterMatchers/HasEntries.html +2 -2
- data/docs/Mocha/ParameterMatchers/HasEntry.html +2 -2
- data/docs/Mocha/ParameterMatchers/HasKey.html +2 -2
- data/docs/Mocha/ParameterMatchers/HasValue.html +2 -2
- data/docs/Mocha/ParameterMatchers/Includes.html +2 -2
- data/docs/Mocha/ParameterMatchers/InstanceOf.html +2 -2
- data/docs/Mocha/ParameterMatchers/IsA.html +2 -2
- data/docs/Mocha/ParameterMatchers/KindOf.html +2 -2
- data/docs/Mocha/ParameterMatchers/Not.html +2 -2
- data/docs/Mocha/ParameterMatchers/Optionally.html +2 -2
- data/docs/Mocha/ParameterMatchers/RegexpMatches.html +2 -2
- data/docs/Mocha/ParameterMatchers/RespondsWith.html +2 -2
- data/docs/Mocha/ParameterMatchers/YamlEquivalent.html +2 -2
- data/docs/Mocha/Sequence.html +2 -2
- data/docs/Mocha/StateMachine.html +2 -2
- data/docs/Mocha/StateMachine/State.html +2 -2
- data/docs/Mocha/StateMachine/StatePredicate.html +2 -2
- data/docs/Mocha/StubbingError.html +2 -2
- data/docs/_index.html +3 -3
- data/docs/file.COPYING.html +2 -2
- data/docs/file.MIT-LICENSE.html +2 -2
- data/docs/file.README.html +2 -2
- data/docs/file.RELEASE.html +30 -2
- data/docs/frames.html +1 -1
- data/docs/index.html +2 -2
- data/docs/method_list.html +20 -4
- data/docs/top-level-namespace.html +2 -2
- data/lib/mocha/block_matcher.rb +31 -0
- data/lib/mocha/expectation.rb +47 -6
- data/lib/mocha/invocation.rb +9 -5
- data/lib/mocha/version.rb +1 -1
- data/lib/mocha/yield_parameters.rb +5 -11
- data/test/acceptance/acceptance_test_helper.rb +1 -0
- data/test/acceptance/display_matching_invocations_alongside_expectations_test.rb +5 -5
- data/test/acceptance/failure_messages_test.rb +16 -0
- data/test/acceptance/multiple_yielding_test.rb +56 -0
- data/test/acceptance/yielding_test.rb +78 -0
- data/test/unit/expectation_test.rb +15 -1
- data/test/unit/yield_parameters_test.rb +35 -53
- metadata +6 -8
- data/lib/mocha/multiple_yields.rb +0 -15
- data/lib/mocha/no_yields.rb +0 -5
- data/lib/mocha/single_yield.rb +0 -13
- data/test/unit/multiple_yields_test.rb +0 -16
- data/test/unit/no_yields_test.rb +0 -16
- data/test/unit/single_yield_test.rb +0 -16
data/lib/mocha/expectation.rb
CHANGED
@@ -10,6 +10,7 @@ require 'mocha/in_state_ordering_constraint'
|
|
10
10
|
require 'mocha/change_state_side_effect'
|
11
11
|
require 'mocha/cardinality'
|
12
12
|
require 'mocha/configuration'
|
13
|
+
require 'mocha/block_matcher'
|
13
14
|
|
14
15
|
module Mocha
|
15
16
|
# Methods on expectations returned from {Mock#expects}, {Mock#stubs}, {ObjectMethods#expects} and {ObjectMethods#stubs}.
|
@@ -224,6 +225,44 @@ module Mocha
|
|
224
225
|
self
|
225
226
|
end
|
226
227
|
|
228
|
+
# Modifies expectation so that the expected method must be called with a block.
|
229
|
+
#
|
230
|
+
# @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
|
231
|
+
#
|
232
|
+
# @example Expected method must be called with a block.
|
233
|
+
# object = mock()
|
234
|
+
# object.expects(:expected_method).with_block_given
|
235
|
+
# object.expected_method { 1 + 1 }
|
236
|
+
# # => verify succeeds
|
237
|
+
#
|
238
|
+
# object = mock()
|
239
|
+
# object.expects(:expected_method).with_block_given
|
240
|
+
# object.expected_method
|
241
|
+
# # => verify fails
|
242
|
+
def with_block_given
|
243
|
+
@block_matcher = BlockMatchers::BlockGiven.new
|
244
|
+
self
|
245
|
+
end
|
246
|
+
|
247
|
+
# Modifies expectation so that the expected method must be called without a block.
|
248
|
+
#
|
249
|
+
# @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
|
250
|
+
#
|
251
|
+
# @example Expected method must be called without a block.
|
252
|
+
# object = mock()
|
253
|
+
# object.expects(:expected_method).with_no_block_given
|
254
|
+
# object.expected_method
|
255
|
+
# # => verify succeeds
|
256
|
+
#
|
257
|
+
# object = mock()
|
258
|
+
# object.expects(:expected_method).with_block_given
|
259
|
+
# object.expected_method { 1 + 1 }
|
260
|
+
# # => verify fails
|
261
|
+
def with_no_block_given
|
262
|
+
@block_matcher = BlockMatchers::NoBlockGiven.new
|
263
|
+
self
|
264
|
+
end
|
265
|
+
|
227
266
|
# Modifies expectation so that when the expected method is called, it yields with the specified +parameters+ (even if no block is provided, in which case yielding will result in a +LocalJumpError+).
|
228
267
|
#
|
229
268
|
# May be called multiple times on the same expectation for consecutive invocations.
|
@@ -256,13 +295,12 @@ module Mocha
|
|
256
295
|
# fibonacci.next_pair { |first, second| sum = first + second }
|
257
296
|
# sum # => 2
|
258
297
|
def yields(*parameters)
|
259
|
-
|
260
|
-
self
|
298
|
+
multiple_yields(parameters)
|
261
299
|
end
|
262
300
|
|
263
301
|
# Modifies expectation so that when the expected method is called, it yields multiple times per invocation with the specified +parameter_groups+ (even if no block is provided, in which case yielding will result in a +LocalJumpError+).
|
264
302
|
#
|
265
|
-
# @param [*Array<Array>] parameter_groups each element of +parameter_groups+ should iself be an +Array+ representing the parameters to be passed to the block for a single yield.
|
303
|
+
# @param [*Array<Array>] parameter_groups each element of +parameter_groups+ should iself be an +Array+ representing the parameters to be passed to the block for a single yield. Any element of +parameter_groups+ that is not an +Array+ is wrapped in an +Array+.
|
266
304
|
# @return [Expectation] the same expectation, thereby allowing invocations of other {Expectation} methods to be chained.
|
267
305
|
# @see #then
|
268
306
|
#
|
@@ -283,7 +321,7 @@ module Mocha
|
|
283
321
|
# rows_from_first_invocation # => [['old_row1_col1', 'old_row1_col2'], ['old_row2_col1', '']]
|
284
322
|
# rows_from_second_invocation # => [['new_row1_col1', ''], ['new_row2_col1', 'new_row2_col2']]
|
285
323
|
def multiple_yields(*parameter_groups)
|
286
|
-
@yield_parameters.
|
324
|
+
@yield_parameters.add(*parameter_groups)
|
287
325
|
self
|
288
326
|
end
|
289
327
|
|
@@ -511,6 +549,7 @@ module Mocha
|
|
511
549
|
@mock = mock
|
512
550
|
@method_matcher = MethodMatcher.new(expected_method_name.to_sym)
|
513
551
|
@parameters_matcher = ParametersMatcher.new
|
552
|
+
@block_matcher = BlockMatchers::OptionalBlock.new
|
514
553
|
@ordering_constraints = []
|
515
554
|
@side_effects = []
|
516
555
|
@cardinality = Cardinality.exactly(1)
|
@@ -551,7 +590,7 @@ module Mocha
|
|
551
590
|
|
552
591
|
# @private
|
553
592
|
def match?(invocation)
|
554
|
-
@method_matcher.match?(invocation.method_name) && @parameters_matcher.match?(invocation.arguments) && in_correct_order?
|
593
|
+
@method_matcher.match?(invocation.method_name) && @parameters_matcher.match?(invocation.arguments) && @block_matcher.match?(invocation.block) && in_correct_order?
|
555
594
|
end
|
556
595
|
|
557
596
|
# @private
|
@@ -601,7 +640,9 @@ module Mocha
|
|
601
640
|
|
602
641
|
# @private
|
603
642
|
def method_signature
|
604
|
-
"#{@mock.mocha_inspect}.#{@method_matcher.mocha_inspect}#{@parameters_matcher.mocha_inspect}"
|
643
|
+
signature = "#{@mock.mocha_inspect}.#{@method_matcher.mocha_inspect}#{@parameters_matcher.mocha_inspect}"
|
644
|
+
signature << " #{@block_matcher.mocha_inspect}" if @block_matcher.mocha_inspect
|
645
|
+
signature
|
605
646
|
end
|
606
647
|
end
|
607
648
|
end
|
data/lib/mocha/invocation.rb
CHANGED
@@ -8,7 +8,7 @@ require 'mocha/deprecation'
|
|
8
8
|
|
9
9
|
module Mocha
|
10
10
|
class Invocation
|
11
|
-
attr_reader :method_name
|
11
|
+
attr_reader :method_name, :block
|
12
12
|
|
13
13
|
def initialize(mock, method_name, *arguments, &block)
|
14
14
|
@mock = mock
|
@@ -27,10 +27,12 @@ module Mocha
|
|
27
27
|
else
|
28
28
|
raise LocalJumpError unless Mocha.configuration.reinstate_undocumented_behaviour_from_v1_9?
|
29
29
|
yield_args_description = ParametersMatcher.new(yield_args).mocha_inspect
|
30
|
-
Deprecation.warning(
|
30
|
+
Deprecation.warning(
|
31
31
|
"Stubbed method was instructed to yield #{yield_args_description}, but no block was given by invocation: #{call_description}.",
|
32
|
-
'This will raise a LocalJumpError in the future.'
|
33
|
-
|
32
|
+
' This will raise a LocalJumpError in the future.',
|
33
|
+
' Use Expectation#with_block_given to constrain this expectation to match invocations supplying a block.',
|
34
|
+
' And, if necessary, add another expectation to match invocations not supplying a block.'
|
35
|
+
)
|
34
36
|
end
|
35
37
|
end
|
36
38
|
return_values.next(self)
|
@@ -53,7 +55,9 @@ module Mocha
|
|
53
55
|
end
|
54
56
|
|
55
57
|
def call_description
|
56
|
-
"#{@mock.mocha_inspect}.#{@method_name}#{ParametersMatcher.new(@arguments).mocha_inspect}"
|
58
|
+
description = "#{@mock.mocha_inspect}.#{@method_name}#{ParametersMatcher.new(@arguments).mocha_inspect}"
|
59
|
+
description << ' { ... }' unless @block.nil?
|
60
|
+
description
|
57
61
|
end
|
58
62
|
|
59
63
|
def short_call_description
|
data/lib/mocha/version.rb
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
require 'mocha/no_yields'
|
2
|
-
require 'mocha/single_yield'
|
3
|
-
require 'mocha/multiple_yields'
|
4
|
-
|
5
1
|
module Mocha
|
6
2
|
class YieldParameters
|
7
3
|
def initialize
|
@@ -10,18 +6,16 @@ module Mocha
|
|
10
6
|
|
11
7
|
def next_invocation
|
12
8
|
case @parameter_groups.length
|
13
|
-
when 0 then
|
9
|
+
when 0 then []
|
14
10
|
when 1 then @parameter_groups.first
|
15
11
|
else @parameter_groups.shift
|
16
12
|
end
|
17
13
|
end
|
18
14
|
|
19
|
-
def add(*
|
20
|
-
@parameter_groups <<
|
21
|
-
|
22
|
-
|
23
|
-
def multiple_add(*parameter_groups)
|
24
|
-
@parameter_groups << MultipleYields.new(*parameter_groups)
|
15
|
+
def add(*parameter_groups)
|
16
|
+
@parameter_groups << parameter_groups.map do |pg|
|
17
|
+
pg.is_a?(Array) ? pg : [pg]
|
18
|
+
end
|
25
19
|
end
|
26
20
|
end
|
27
21
|
end
|
@@ -31,7 +31,7 @@ class DisplayMatchingInvocationsAlongsideExpectationsTest < Mocha::TestCase
|
|
31
31
|
test_result = run_as_test do
|
32
32
|
foo = mock('foo')
|
33
33
|
foo.expects(:bar).with(1).returns('a')
|
34
|
-
foo.stubs(:bar).with(any_parameters).multiple_yields(
|
34
|
+
foo.stubs(:bar).with(any_parameters).multiple_yields('bc', %w[d e]).returns('f').raises(StandardError).throws(:tag, 'value')
|
35
35
|
|
36
36
|
foo.bar(1, 2) { |_ignored| }
|
37
37
|
assert_raises(StandardError) { foo.bar(3, 4) { |_ignored| } }
|
@@ -40,9 +40,9 @@ class DisplayMatchingInvocationsAlongsideExpectationsTest < Mocha::TestCase
|
|
40
40
|
assert_invocations(
|
41
41
|
test_result,
|
42
42
|
'- allowed any number of times, invoked 3 times: #<Mock:foo>.bar(any_parameters)',
|
43
|
-
' - #<Mock:foo>.bar(1, 2) # => "f" after yielding ("
|
44
|
-
' - #<Mock:foo>.bar(3, 4) # => raised StandardError after yielding ("
|
45
|
-
' - #<Mock:foo>.bar(5, 6) # => threw (:tag, "value") after yielding ("
|
43
|
+
' - #<Mock:foo>.bar(1, 2) { ... } # => "f" after yielding ("bc"), then ("d", "e")',
|
44
|
+
' - #<Mock:foo>.bar(3, 4) { ... } # => raised StandardError after yielding ("bc"), then ("d", "e")',
|
45
|
+
' - #<Mock:foo>.bar(5, 6) { ... } # => threw (:tag, "value") after yielding ("bc"), then ("d", "e")'
|
46
46
|
)
|
47
47
|
end
|
48
48
|
|
@@ -57,7 +57,7 @@ class DisplayMatchingInvocationsAlongsideExpectationsTest < Mocha::TestCase
|
|
57
57
|
assert_invocations(
|
58
58
|
test_result,
|
59
59
|
'- allowed any number of times, invoked once: #<Mock:foo>.bar(any_parameters)',
|
60
|
-
' - #<Mock:foo>.bar(1, 2) # => nil after yielding ()'
|
60
|
+
' - #<Mock:foo>.bar(1, 2) { ... } # => nil after yielding ()'
|
61
61
|
)
|
62
62
|
end
|
63
63
|
|
@@ -58,4 +58,20 @@ class FailureMessagesTest < Mocha::TestCase
|
|
58
58
|
end
|
59
59
|
assert_match Regexp.new(%("Foo")), test_result.failures[0].message
|
60
60
|
end
|
61
|
+
|
62
|
+
def test_should_display_that_block_was_expected
|
63
|
+
test_result = run_as_test do
|
64
|
+
foo = mock
|
65
|
+
foo.expects(:bar).with_block_given
|
66
|
+
end
|
67
|
+
assert_match Regexp.new(' with block given$'), test_result.failures[0].message
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_should_display_that_block_was_not_expected
|
71
|
+
test_result = run_as_test do
|
72
|
+
foo = mock
|
73
|
+
foo.expects(:bar).with_no_block_given
|
74
|
+
end
|
75
|
+
assert_match Regexp.new(' with no block given$'), test_result.failures[0].message
|
76
|
+
end
|
61
77
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require File.expand_path('../acceptance_test_helper', __FILE__)
|
2
|
+
|
3
|
+
class MultipleYieldingTest < Mocha::TestCase
|
4
|
+
include AcceptanceTest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
setup_acceptance_test
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
teardown_acceptance_test
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_yields_values_multiple_times_when_stubbed_method_is_invoked
|
15
|
+
test_result = run_as_test do
|
16
|
+
m = mock('m')
|
17
|
+
m.stubs(:foo).multiple_yields([1], [2, 3])
|
18
|
+
yielded = []
|
19
|
+
m.foo { |*args| yielded << args }
|
20
|
+
assert_equal [[1], [2, 3]], yielded
|
21
|
+
end
|
22
|
+
assert_passed(test_result)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_yields_values_multiple_times_when_multiple_yields_arguments_are_not_arrays
|
26
|
+
test_result = run_as_test do
|
27
|
+
m = mock('m')
|
28
|
+
m.stubs(:foo).multiple_yields(1, { :b => 2 }, '3')
|
29
|
+
yielded = []
|
30
|
+
m.foo { |*args| yielded << args }
|
31
|
+
assert_equal [[1], [{ :b => 2 }], ['3']], yielded
|
32
|
+
end
|
33
|
+
assert_passed(test_result)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_raises_local_jump_error_if_instructed_to_multiple_yield_but_no_block_given
|
37
|
+
test_result = run_as_test do
|
38
|
+
m = mock('m')
|
39
|
+
m.stubs(:foo).multiple_yields([])
|
40
|
+
assert_raises(LocalJumpError) { m.foo }
|
41
|
+
end
|
42
|
+
assert_passed(test_result)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_yields_different_values_on_consecutive_invocations
|
46
|
+
test_result = run_as_test do
|
47
|
+
m = mock('m')
|
48
|
+
m.stubs(:foo).multiple_yields([0], [1, 2]).then.multiple_yields([3], [4, 5])
|
49
|
+
yielded = []
|
50
|
+
m.foo { |*args| yielded << args }
|
51
|
+
m.foo { |*args| yielded << args }
|
52
|
+
assert_equal [[0], [1, 2], [3], [4, 5]], yielded
|
53
|
+
end
|
54
|
+
assert_passed(test_result)
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require File.expand_path('../acceptance_test_helper', __FILE__)
|
2
|
+
|
3
|
+
class YieldingTest < Mocha::TestCase
|
4
|
+
include AcceptanceTest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
setup_acceptance_test
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
teardown_acceptance_test
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_yields_when_stubbed_method_is_invoked
|
15
|
+
test_result = run_as_test do
|
16
|
+
m = mock('m')
|
17
|
+
m.stubs(:foo).yields
|
18
|
+
yielded = false
|
19
|
+
m.foo { yielded = true }
|
20
|
+
assert yielded
|
21
|
+
end
|
22
|
+
assert_passed(test_result)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_raises_local_jump_error_if_instructed_to_yield_but_no_block_given
|
26
|
+
test_result = run_as_test do
|
27
|
+
m = mock('m')
|
28
|
+
m.stubs(:foo).yields
|
29
|
+
assert_raises(LocalJumpError) { m.foo }
|
30
|
+
end
|
31
|
+
assert_passed(test_result)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_yields_when_block_expected_and_block_given
|
35
|
+
test_result = run_as_test do
|
36
|
+
m = mock('m')
|
37
|
+
m.stubs(:foo).with_block_given.yields
|
38
|
+
m.stubs(:foo).with_no_block_given.returns(:bar)
|
39
|
+
yielded = false
|
40
|
+
m.foo { yielded = true }
|
41
|
+
assert yielded
|
42
|
+
end
|
43
|
+
assert_passed(test_result)
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_returns_when_no_block_expected_and_no_block_given
|
47
|
+
test_result = run_as_test do
|
48
|
+
m = mock('m')
|
49
|
+
m.stubs(:foo).with_block_given.yields
|
50
|
+
m.stubs(:foo).with_no_block_given.returns(:bar)
|
51
|
+
assert_equal :bar, m.foo
|
52
|
+
end
|
53
|
+
assert_passed(test_result)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_yields_values_when_stubbed_method_is_invoked
|
57
|
+
test_result = run_as_test do
|
58
|
+
m = mock('m')
|
59
|
+
m.stubs(:foo).yields(0, 1)
|
60
|
+
yielded = []
|
61
|
+
m.foo { |*args| yielded << args }
|
62
|
+
assert_equal [[0, 1]], yielded
|
63
|
+
end
|
64
|
+
assert_passed(test_result)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_yields_different_values_on_consecutive_invocations
|
68
|
+
test_result = run_as_test do
|
69
|
+
m = mock('m')
|
70
|
+
m.stubs(:foo).yields(0, 1).then.yields(2, 3)
|
71
|
+
yielded = []
|
72
|
+
m.foo { |*args| yielded << args }
|
73
|
+
m.foo { |*args| yielded << args }
|
74
|
+
assert_equal [[0, 1], [2, 3]], yielded
|
75
|
+
end
|
76
|
+
assert_passed(test_result)
|
77
|
+
end
|
78
|
+
end
|
@@ -8,6 +8,7 @@ require 'execution_point'
|
|
8
8
|
require 'simple_counter'
|
9
9
|
require 'deprecation_disabler'
|
10
10
|
|
11
|
+
# rubocop:disable Metrics/ClassLength
|
11
12
|
class ExpectationTest < Mocha::TestCase
|
12
13
|
include Mocha
|
13
14
|
|
@@ -119,7 +120,7 @@ class ExpectationTest < Mocha::TestCase
|
|
119
120
|
assert_raises(LocalJumpError) { invoke(new_expectation.yields(:foo)) }
|
120
121
|
end
|
121
122
|
|
122
|
-
def
|
123
|
+
def test_yields_should_display_warning_when_caller_does_not_provide_block_and_behaviour_from_v1_9_retained
|
123
124
|
Mocha::Configuration.override(:reinstate_undocumented_behaviour_from_v1_9 => true) do
|
124
125
|
DeprecationDisabler.disable_deprecations do
|
125
126
|
invoke(new_expectation.yields(:foo, 1, [2, 3]))
|
@@ -131,6 +132,18 @@ class ExpectationTest < Mocha::TestCase
|
|
131
132
|
assert message.include?('This will raise a LocalJumpError in the future.')
|
132
133
|
end
|
133
134
|
|
135
|
+
def test_multiple_yields_should_display_warning_when_caller_does_not_provide_block_and_behaviour_from_v1_9_retained
|
136
|
+
Mocha::Configuration.override(:reinstate_undocumented_behaviour_from_v1_9 => true) do
|
137
|
+
DeprecationDisabler.disable_deprecations do
|
138
|
+
invoke(new_expectation.multiple_yields(:foo, 1, [2, 3]))
|
139
|
+
end
|
140
|
+
end
|
141
|
+
assert message = Deprecation.messages.last
|
142
|
+
assert message.include?('Stubbed method was instructed to yield (2, 3)')
|
143
|
+
assert message.include?('but no block was given by invocation: :irrelevant.expected_method()')
|
144
|
+
assert message.include?('This will raise a LocalJumpError in the future.')
|
145
|
+
end
|
146
|
+
|
134
147
|
def test_should_yield_with_specified_parameters
|
135
148
|
yielded_parameters = nil
|
136
149
|
invoke(new_expectation.yields(1, 2, 3)) { |*parameters| yielded_parameters = parameters }
|
@@ -490,3 +503,4 @@ class ExpectationTest < Mocha::TestCase
|
|
490
503
|
assert expectation.inspect.include?(expectation.mocha_inspect)
|
491
504
|
end
|
492
505
|
end
|
506
|
+
# rubocop:enable Metrics/ClassLength
|
@@ -1,91 +1,73 @@
|
|
1
1
|
require File.expand_path('../../test_helper', __FILE__)
|
2
2
|
|
3
3
|
require 'mocha/yield_parameters'
|
4
|
-
require 'mocha/no_yields'
|
5
|
-
require 'mocha/single_yield'
|
6
|
-
require 'mocha/multiple_yields'
|
7
4
|
|
8
5
|
class YieldParametersTest < Mocha::TestCase
|
9
6
|
include Mocha
|
10
7
|
|
11
8
|
def test_should_return_null_yield_parameter_group_by_default
|
12
|
-
|
13
|
-
assert yield_parameters.next_invocation.is_a?(NoYields)
|
9
|
+
assert_next_invocation_yields(YieldParameters.new, [])
|
14
10
|
end
|
15
11
|
|
16
12
|
def test_should_return_single_yield_parameter_group
|
17
13
|
yield_parameters = YieldParameters.new
|
18
|
-
yield_parameters.add(1, 2, 3)
|
19
|
-
|
20
|
-
assert parameter_group.is_a?(SingleYield)
|
21
|
-
assert_equal [1, 2, 3], parameter_group.parameters
|
14
|
+
yield_parameters.add([1, 2, 3])
|
15
|
+
assert_next_invocation_yields(yield_parameters, [[1, 2, 3]])
|
22
16
|
end
|
23
17
|
|
24
18
|
def test_should_keep_returning_single_yield_parameter_group
|
25
19
|
yield_parameters = YieldParameters.new
|
26
|
-
yield_parameters.add(1, 2, 3)
|
27
|
-
yield_parameters
|
28
|
-
|
29
|
-
assert parameter_group.is_a?(SingleYield)
|
30
|
-
assert_equal [1, 2, 3], parameter_group.parameters
|
31
|
-
parameter_group = yield_parameters.next_invocation
|
32
|
-
assert parameter_group.is_a?(SingleYield)
|
33
|
-
assert_equal [1, 2, 3], parameter_group.parameters
|
20
|
+
yield_parameters.add([1, 2, 3])
|
21
|
+
assert_next_invocation_yields(yield_parameters, [[1, 2, 3]])
|
22
|
+
assert_next_invocation_yields(yield_parameters, [[1, 2, 3]])
|
34
23
|
end
|
35
24
|
|
36
25
|
def test_should_return_consecutive_single_yield_parameter_groups
|
37
26
|
yield_parameters = YieldParameters.new
|
38
|
-
yield_parameters.add(1, 2, 3)
|
39
|
-
yield_parameters.add(4, 5)
|
40
|
-
|
41
|
-
|
42
|
-
assert_equal [1, 2, 3], parameter_group.parameters
|
43
|
-
parameter_group = yield_parameters.next_invocation
|
44
|
-
assert parameter_group.is_a?(SingleYield)
|
45
|
-
assert_equal [4, 5], parameter_group.parameters
|
27
|
+
yield_parameters.add([1, 2, 3])
|
28
|
+
yield_parameters.add([4, 5])
|
29
|
+
assert_next_invocation_yields(yield_parameters, [[1, 2, 3]])
|
30
|
+
assert_next_invocation_yields(yield_parameters, [[4, 5]])
|
46
31
|
end
|
47
32
|
|
48
33
|
def test_should_return_multiple_yield_parameter_group
|
49
34
|
yield_parameters = YieldParameters.new
|
50
|
-
yield_parameters.
|
51
|
-
|
52
|
-
|
53
|
-
|
35
|
+
yield_parameters.add([1, 2, 3], [4, 5])
|
36
|
+
assert_next_invocation_yields(yield_parameters, [[1, 2, 3], [4, 5]])
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_should_return_multiple_yield_parameter_group_when_arguments_are_not_arrays
|
40
|
+
yield_parameters = YieldParameters.new
|
41
|
+
yield_parameters.add(1, { :b => 2 }, 3)
|
42
|
+
assert_next_invocation_yields(yield_parameters, [[1], [{ :b => 2 }], [3]])
|
54
43
|
end
|
55
44
|
|
56
45
|
def test_should_keep_returning_multiple_yield_parameter_group
|
57
46
|
yield_parameters = YieldParameters.new
|
58
|
-
yield_parameters.
|
59
|
-
yield_parameters
|
60
|
-
|
61
|
-
assert parameter_group.is_a?(MultipleYields)
|
62
|
-
assert_equal [[1, 2, 3], [4, 5]], parameter_group.parameter_groups
|
63
|
-
parameter_group = yield_parameters.next_invocation
|
64
|
-
assert parameter_group.is_a?(MultipleYields)
|
65
|
-
assert_equal [[1, 2, 3], [4, 5]], parameter_group.parameter_groups
|
47
|
+
yield_parameters.add([1, 2, 3], [4, 5])
|
48
|
+
assert_next_invocation_yields(yield_parameters, [[1, 2, 3], [4, 5]])
|
49
|
+
assert_next_invocation_yields(yield_parameters, [[1, 2, 3], [4, 5]])
|
66
50
|
end
|
67
51
|
|
68
52
|
def test_should_return_consecutive_multiple_yield_parameter_groups
|
69
53
|
yield_parameters = YieldParameters.new
|
70
|
-
yield_parameters.
|
71
|
-
yield_parameters.
|
72
|
-
|
73
|
-
|
74
|
-
assert_equal [[1, 2, 3], [4, 5]], parameter_group.parameter_groups
|
75
|
-
parameter_group = yield_parameters.next_invocation
|
76
|
-
assert parameter_group.is_a?(MultipleYields)
|
77
|
-
assert_equal [[6, 7], [8, 9, 0]], parameter_group.parameter_groups
|
54
|
+
yield_parameters.add([1, 2, 3], [4, 5])
|
55
|
+
yield_parameters.add([6, 7], [8, 9, 0])
|
56
|
+
assert_next_invocation_yields(yield_parameters, [[1, 2, 3], [4, 5]])
|
57
|
+
assert_next_invocation_yields(yield_parameters, [[6, 7], [8, 9, 0]])
|
78
58
|
end
|
79
59
|
|
80
60
|
def test_should_return_consecutive_single_and_multiple_yield_parameter_groups
|
81
61
|
yield_parameters = YieldParameters.new
|
82
|
-
yield_parameters.add(1, 2, 3)
|
83
|
-
yield_parameters.
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
62
|
+
yield_parameters.add([1, 2, 3])
|
63
|
+
yield_parameters.add([4, 5, 6], [7, 8])
|
64
|
+
assert_next_invocation_yields(yield_parameters, [[1, 2, 3]])
|
65
|
+
assert_next_invocation_yields(yield_parameters, [[4, 5, 6], [7, 8]])
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def assert_next_invocation_yields(yield_parameters, expected)
|
71
|
+
assert_equal expected, yield_parameters.next_invocation
|
90
72
|
end
|
91
73
|
end
|