mocha 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +28 -10
- data/examples/stubba.rb +1 -1
- data/lib/mocha/auto_verify.rb +6 -6
- data/lib/mocha/deprecation.rb +22 -0
- data/lib/mocha/exception_raiser.rb +17 -0
- data/lib/mocha/expectation.rb +167 -84
- data/lib/mocha/infinite_range.rb +4 -6
- data/lib/mocha/inspect.rb +3 -1
- data/lib/mocha/is_a.rb +9 -0
- data/lib/mocha/missing_expectation.rb +27 -0
- data/lib/mocha/mock.rb +191 -5
- data/lib/mocha/multiple_yields.rb +20 -0
- data/lib/mocha/no_yields.rb +11 -0
- data/lib/mocha/object.rb +11 -1
- data/lib/mocha/parameter_matchers.rb +9 -0
- data/lib/mocha/parameter_matchers/all_of.rb +39 -0
- data/lib/mocha/parameter_matchers/any_of.rb +44 -0
- data/lib/mocha/parameter_matchers/anything.rb +30 -0
- data/lib/mocha/parameter_matchers/has_entry.rb +39 -0
- data/lib/mocha/parameter_matchers/has_key.rb +39 -0
- data/lib/mocha/parameter_matchers/has_value.rb +39 -0
- data/lib/mocha/parameter_matchers/includes.rb +37 -0
- data/lib/mocha/return_values.rb +31 -0
- data/lib/mocha/single_return_value.rb +24 -0
- data/lib/mocha/single_yield.rb +18 -0
- data/lib/mocha/standalone.rb +2 -0
- data/lib/mocha/stub.rb +18 -0
- data/lib/mocha/yield_parameters.rb +31 -0
- data/test/{mocha_acceptance_test.rb → acceptance/mocha_acceptance_test.rb} +1 -1
- data/test/acceptance/mocked_methods_dispatch_acceptance_test.rb +72 -0
- data/test/acceptance/parameter_matcher_acceptance_test.rb +63 -0
- data/test/{standalone_acceptance_test.rb → acceptance/standalone_acceptance_test.rb} +22 -1
- data/test/{stubba_acceptance_test.rb → acceptance/stubba_acceptance_test.rb} +1 -1
- data/test/deprecation_disabler.rb +15 -0
- data/test/{mocha_test_result_integration_test.rb → integration/mocha_test_result_integration_test.rb} +1 -1
- data/test/{stubba_integration_test.rb → integration/stubba_integration_test.rb} +1 -1
- data/test/{stubba_test_result_integration_test.rb → integration/stubba_test_result_integration_test.rb} +1 -1
- data/test/test_helper.rb +8 -0
- data/test/test_runner.rb +31 -0
- data/test/{mocha → unit}/any_instance_method_test.rb +0 -0
- data/test/unit/array_inspect_test.rb +16 -0
- data/test/{mocha → unit}/auto_verify_test.rb +0 -0
- data/test/{mocha → unit}/central_test.rb +0 -0
- data/test/{mocha → unit}/class_method_test.rb +0 -0
- data/test/unit/date_time_inspect_test.rb +21 -0
- data/test/unit/expectation_raiser_test.rb +28 -0
- data/test/{mocha → unit}/expectation_test.rb +105 -63
- data/test/unit/hash_inspect_test.rb +16 -0
- data/test/{mocha → unit}/infinite_range_test.rb +8 -5
- data/test/{mocha → unit}/metaclass_test.rb +0 -0
- data/test/unit/missing_expectation_test.rb +51 -0
- data/test/unit/mock_test.rb +351 -0
- data/test/unit/multiple_yields_test.rb +18 -0
- data/test/unit/no_yield_test.rb +18 -0
- data/test/unit/object_inspect_test.rb +35 -0
- data/test/{mocha → unit}/object_test.rb +0 -0
- data/test/unit/parameter_matchers/all_of_test.rb +26 -0
- data/test/unit/parameter_matchers/any_of_test.rb +26 -0
- data/test/unit/parameter_matchers/anything_test.rb +21 -0
- data/test/unit/parameter_matchers/has_entry_test.rb +25 -0
- data/test/unit/parameter_matchers/has_key_test.rb +25 -0
- data/test/unit/parameter_matchers/has_value_test.rb +25 -0
- data/test/unit/parameter_matchers/includes_test.rb +25 -0
- data/test/unit/parameter_matchers/stub_matcher.rb +22 -0
- data/test/{mocha → unit}/pretty_parameters_test.rb +0 -0
- data/test/unit/return_values_test.rb +63 -0
- data/test/{mocha → unit}/setup_and_teardown_test.rb +0 -0
- data/test/unit/single_return_value_test.rb +33 -0
- data/test/unit/single_yield_test.rb +18 -0
- data/test/unit/string_inspect_test.rb +11 -0
- data/test/unit/stub_test.rb +24 -0
- data/test/unit/yield_parameters_test.rb +93 -0
- metadata +117 -73
- data/lib/mocha/mock_methods.rb +0 -122
- data/test/all_tests.rb +0 -75
- data/test/mocha/inspect_test.rb +0 -90
- data/test/mocha/mock_methods_test.rb +0 -235
- data/test/mocha/mock_test.rb +0 -84
data/Rakefile
CHANGED
@@ -1,19 +1,37 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake/rdoctask'
|
3
3
|
require 'rake/gempackagetask'
|
4
|
+
require 'rake/testtask'
|
4
5
|
require 'rake/contrib/sshpublisher'
|
5
6
|
|
6
7
|
module Mocha
|
7
|
-
VERSION = "0.
|
8
|
+
VERSION = "0.5.0"
|
8
9
|
end
|
9
10
|
|
10
|
-
desc "
|
11
|
+
desc "Run all tests"
|
11
12
|
task :default => :test_all
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
task :test_all => [:test_unit, :test_integration, :test_acceptance]
|
15
|
+
|
16
|
+
desc "Run unit tests"
|
17
|
+
Rake::TestTask.new(:test_unit) do |t|
|
18
|
+
t.libs << 'test'
|
19
|
+
t.test_files = FileList['test/unit/**/*_test.rb']
|
20
|
+
t.verbose = true
|
21
|
+
end
|
22
|
+
|
23
|
+
desc "Run integration tests"
|
24
|
+
Rake::TestTask.new(:test_integration) do |t|
|
25
|
+
t.libs << 'test'
|
26
|
+
t.test_files = FileList['test/integration/*_test.rb']
|
27
|
+
t.verbose = true
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Run acceptance tests"
|
31
|
+
Rake::TestTask.new(:test_acceptance) do |t|
|
32
|
+
t.libs << 'test'
|
33
|
+
t.test_files = FileList['test/acceptance/*_test.rb']
|
34
|
+
t.verbose = true
|
17
35
|
end
|
18
36
|
|
19
37
|
desc 'Generate RDoc'
|
@@ -21,9 +39,8 @@ Rake::RDocTask.new do |task|
|
|
21
39
|
task.main = 'README'
|
22
40
|
task.title = 'Mocha'
|
23
41
|
task.rdoc_dir = 'doc'
|
24
|
-
task.template = "html_with_google_analytics"
|
25
|
-
task.
|
26
|
-
task.rdoc_files.include('README', 'RELEASE', 'COPYING', 'MIT-LICENSE', 'agiledox.txt', 'lib/mocha/auto_verify.rb', 'lib/mocha/mock_methods.rb', 'lib/mocha/expectation.rb', 'lib/mocha/object.rb')
|
42
|
+
task.template = File.expand_path(File.join(File.dirname(__FILE__), "templates", "html_with_google_analytics"))
|
43
|
+
task.rdoc_files.include('README', 'RELEASE', 'COPYING', 'MIT-LICENSE', 'agiledox.txt', 'lib/mocha/auto_verify.rb', 'lib/mocha/mock.rb', 'lib/mocha/expectation.rb', 'lib/mocha/object.rb', 'lib/mocha/parameter_matchers.rb', 'lib/mocha/parameter_matchers')
|
27
44
|
end
|
28
45
|
task :rdoc => :examples
|
29
46
|
|
@@ -50,6 +67,7 @@ end
|
|
50
67
|
|
51
68
|
desc "Convert example ruby files to syntax-highlighted html"
|
52
69
|
task :examples do
|
70
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), "vendor", "coderay-0.7.4.215", "lib"))
|
53
71
|
require 'coderay'
|
54
72
|
mkdir_p 'doc/examples'
|
55
73
|
File.open('doc/examples/coderay.css', 'w') do |output|
|
@@ -89,7 +107,6 @@ specification = Gem::Specification.new do |s|
|
|
89
107
|
|
90
108
|
s.autorequire = 'mocha'
|
91
109
|
s.files = FileList['{lib,test,examples}/**/*.rb', '[A-Z]*'].exclude('TODO').to_a
|
92
|
-
s.test_file = "test/all_tests.rb"
|
93
110
|
end
|
94
111
|
|
95
112
|
Rake::GemPackageTask.new(specification) do |package|
|
@@ -107,6 +124,7 @@ end
|
|
107
124
|
|
108
125
|
desc "Publish package files on RubyForge."
|
109
126
|
task :publish_packages => [:verify_user, :verify_password, :package] do
|
127
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), "vendor", "meta_project-0.4.15", "lib"))
|
110
128
|
require 'meta_project'
|
111
129
|
require 'rake/contrib/xforge'
|
112
130
|
release_files = FileList[
|
data/examples/stubba.rb
CHANGED
data/lib/mocha/auto_verify.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'mocha/mock'
|
2
2
|
|
3
|
-
|
4
|
-
#
|
5
|
-
# Mocks created this way will have their expectations automatically verified at the end of the test.
|
6
|
-
#
|
7
|
-
# See Mocha::MockMethods for methods on mock objects.
|
8
|
-
module Mocha
|
3
|
+
module Mocha # :nodoc:
|
9
4
|
|
5
|
+
# Methods added to TestCase allowing creation of traditional mock objects.
|
6
|
+
#
|
7
|
+
# Mocks created this way will have their expectations automatically verified at the end of the test.
|
8
|
+
#
|
9
|
+
# See Mock for methods on mock objects.
|
10
10
|
module AutoVerify
|
11
11
|
|
12
12
|
def mocks # :nodoc:
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Mocha
|
2
|
+
|
3
|
+
class Deprecation
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
attr_accessor :mode, :messages
|
8
|
+
|
9
|
+
def warning(message)
|
10
|
+
@messages << message
|
11
|
+
$stderr.puts "Mocha deprecation warning: #{message}" unless mode == :disabled
|
12
|
+
$stderr.puts caller.join("\n ") if mode == :debug
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
self.mode = :enabled
|
18
|
+
self.messages = []
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Mocha # :nodoc:
|
2
|
+
|
3
|
+
class ExceptionRaiser # :nodoc:
|
4
|
+
|
5
|
+
def initialize(exception, message)
|
6
|
+
@exception, @message = exception, message
|
7
|
+
end
|
8
|
+
|
9
|
+
def evaluate
|
10
|
+
raise @exception, @exception.to_s if @exception == Interrupt
|
11
|
+
raise @exception, @message if @message
|
12
|
+
raise @exception
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/lib/mocha/expectation.rb
CHANGED
@@ -1,21 +1,18 @@
|
|
1
1
|
require 'mocha/infinite_range'
|
2
2
|
require 'mocha/pretty_parameters'
|
3
3
|
require 'mocha/expectation_error'
|
4
|
+
require 'mocha/return_values'
|
5
|
+
require 'mocha/exception_raiser'
|
6
|
+
require 'mocha/yield_parameters'
|
7
|
+
require 'mocha/is_a'
|
4
8
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
module Mocha
|
12
|
-
# Methods on expectations returned from Mocha::MockMethods#expects and Mocha::MockMethods#stubs
|
9
|
+
module Mocha # :nodoc:
|
10
|
+
|
11
|
+
# Methods on expectations returned from Mock#expects, Mock#stubs, Object#expects and Object#stubs.
|
13
12
|
class Expectation
|
14
13
|
|
15
14
|
# :stopdoc:
|
16
15
|
|
17
|
-
class InvalidExpectation < Exception; end
|
18
|
-
|
19
16
|
class AlwaysEqual
|
20
17
|
def ==(other)
|
21
18
|
true
|
@@ -26,23 +23,26 @@ module Mocha
|
|
26
23
|
|
27
24
|
def initialize(mock, method_name, backtrace = nil)
|
28
25
|
@mock, @method_name = mock, method_name
|
29
|
-
@
|
26
|
+
@expected_count = 1
|
30
27
|
@parameters, @parameter_block = AlwaysEqual.new, nil
|
31
|
-
@
|
28
|
+
@invoked_count, @return_values = 0, ReturnValues.new
|
32
29
|
@backtrace = backtrace || caller
|
33
|
-
@
|
30
|
+
@yield_parameters = YieldParameters.new
|
34
31
|
end
|
35
32
|
|
36
|
-
def yield?
|
37
|
-
@yield
|
38
|
-
end
|
39
|
-
|
40
33
|
def match?(method_name, *arguments)
|
34
|
+
return false unless @method_name == method_name
|
41
35
|
if @parameter_block then
|
42
|
-
@parameter_block.call(*arguments)
|
36
|
+
return false unless @parameter_block.call(*arguments)
|
37
|
+
else
|
38
|
+
return false unless (@parameters == arguments)
|
39
|
+
end
|
40
|
+
if @expected_count.is_a?(Range) then
|
41
|
+
return false unless @invoked_count < @expected_count.last
|
43
42
|
else
|
44
|
-
|
43
|
+
return false unless @invoked_count < @expected_count
|
45
44
|
end
|
45
|
+
return true
|
46
46
|
end
|
47
47
|
|
48
48
|
# :startdoc:
|
@@ -54,34 +54,63 @@ module Mocha
|
|
54
54
|
# +range+ can be specified as an exact integer or as a range of integers
|
55
55
|
# object = mock()
|
56
56
|
# object.expects(:expected_method).times(3)
|
57
|
-
# 3.times { object.expected_method }
|
57
|
+
# 3.times { object.expected_method }
|
58
|
+
# # => verify succeeds
|
58
59
|
#
|
59
60
|
# object = mock()
|
60
61
|
# object.expects(:expected_method).times(3)
|
61
|
-
# 2.times { object.expected_method }
|
62
|
+
# 2.times { object.expected_method }
|
63
|
+
# # => verify fails
|
62
64
|
#
|
63
65
|
# object = mock()
|
64
66
|
# object.expects(:expected_method).times(2..4)
|
65
|
-
# 3.times { object.expected_method }
|
67
|
+
# 3.times { object.expected_method }
|
68
|
+
# # => verify succeeds
|
66
69
|
#
|
67
70
|
# object = mock()
|
68
71
|
# object.expects(:expected_method).times(2..4)
|
69
|
-
# object.expected_method
|
72
|
+
# object.expected_method
|
73
|
+
# # => verify fails
|
70
74
|
def times(range)
|
71
|
-
@
|
75
|
+
@expected_count = range
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
# :call-seq: once() -> expectation
|
80
|
+
#
|
81
|
+
# Modifies expectation so that the expected method must be called exactly once.
|
82
|
+
# Note that this is the default behaviour for an expectation, but you may wish to use it for clarity/emphasis.
|
83
|
+
# object = mock()
|
84
|
+
# object.expects(:expected_method).once
|
85
|
+
# object.expected_method
|
86
|
+
# # => verify succeeds
|
87
|
+
#
|
88
|
+
# object = mock()
|
89
|
+
# object.expects(:expected_method).once
|
90
|
+
# object.expected_method
|
91
|
+
# object.expected_method
|
92
|
+
# # => verify fails
|
93
|
+
#
|
94
|
+
# object = mock()
|
95
|
+
# object.expects(:expected_method).once
|
96
|
+
# # => verify fails
|
97
|
+
def once()
|
98
|
+
times(1)
|
72
99
|
self
|
73
100
|
end
|
74
101
|
|
75
|
-
# :call-seq: never -> expectation
|
102
|
+
# :call-seq: never() -> expectation
|
76
103
|
#
|
77
104
|
# Modifies expectation so that the expected method must never be called.
|
78
105
|
# object = mock()
|
79
106
|
# object.expects(:expected_method).never
|
80
|
-
# object.expected_method
|
107
|
+
# object.expected_method
|
108
|
+
# # => verify fails
|
81
109
|
#
|
82
110
|
# object = mock()
|
83
111
|
# object.expects(:expected_method).never
|
84
|
-
# object.expected_method
|
112
|
+
# object.expected_method
|
113
|
+
# # => verify succeeds
|
85
114
|
def never
|
86
115
|
times(0)
|
87
116
|
self
|
@@ -92,11 +121,13 @@ module Mocha
|
|
92
121
|
# Modifies expectation so that the expected method must be called at least a +minimum_number_of_times+.
|
93
122
|
# object = mock()
|
94
123
|
# object.expects(:expected_method).at_least(2)
|
95
|
-
# 3.times { object.expected_method }
|
124
|
+
# 3.times { object.expected_method }
|
125
|
+
# # => verify succeeds
|
96
126
|
#
|
97
127
|
# object = mock()
|
98
128
|
# object.expects(:expected_method).at_least(2)
|
99
|
-
# object.expected_method
|
129
|
+
# object.expected_method
|
130
|
+
# # => verify fails
|
100
131
|
def at_least(minimum_number_of_times)
|
101
132
|
times(Range.at_least(minimum_number_of_times))
|
102
133
|
self
|
@@ -107,7 +138,8 @@ module Mocha
|
|
107
138
|
# Modifies expectation so that the expected method must be called at least once.
|
108
139
|
# object = mock()
|
109
140
|
# object.expects(:expected_method).at_least_once
|
110
|
-
# object.expected_method
|
141
|
+
# object.expected_method
|
142
|
+
# # => verify succeeds
|
111
143
|
#
|
112
144
|
# object = mock()
|
113
145
|
# object.expects(:expected_method).at_least_once
|
@@ -122,11 +154,13 @@ module Mocha
|
|
122
154
|
# Modifies expectation so that the expected method must be called at most a +maximum_number_of_times+.
|
123
155
|
# object = mock()
|
124
156
|
# object.expects(:expected_method).at_most(2)
|
125
|
-
# 2.times { object.expected_method }
|
157
|
+
# 2.times { object.expected_method }
|
158
|
+
# # => verify succeeds
|
126
159
|
#
|
127
160
|
# object = mock()
|
128
161
|
# object.expects(:expected_method).at_most(2)
|
129
|
-
# 3.times { object.expected_method }
|
162
|
+
# 3.times { object.expected_method }
|
163
|
+
# # => verify fails
|
130
164
|
def at_most(maximum_number_of_times)
|
131
165
|
times(Range.at_most(maximum_number_of_times))
|
132
166
|
self
|
@@ -137,11 +171,13 @@ module Mocha
|
|
137
171
|
# Modifies expectation so that the expected method must be called at most once.
|
138
172
|
# object = mock()
|
139
173
|
# object.expects(:expected_method).at_most_once
|
140
|
-
# object.expected_method
|
174
|
+
# object.expected_method
|
175
|
+
# # => verify succeeds
|
141
176
|
#
|
142
177
|
# object = mock()
|
143
178
|
# object.expects(:expected_method).at_most_once
|
144
|
-
# 2.times { object.expected_method }
|
179
|
+
# 2.times { object.expected_method }
|
180
|
+
# # => verify fails
|
145
181
|
def at_most_once()
|
146
182
|
at_most(1)
|
147
183
|
self
|
@@ -152,20 +188,26 @@ module Mocha
|
|
152
188
|
# Modifies expectation so that the expected method must be called with specified +arguments+.
|
153
189
|
# object = mock()
|
154
190
|
# object.expects(:expected_method).with(:param1, :param2)
|
155
|
-
# object.expected_method(:param1, :param2)
|
191
|
+
# object.expected_method(:param1, :param2)
|
192
|
+
# # => verify succeeds
|
156
193
|
#
|
157
194
|
# object = mock()
|
158
195
|
# object.expects(:expected_method).with(:param1, :param2)
|
159
|
-
# object.expected_method(:param3)
|
196
|
+
# object.expected_method(:param3)
|
197
|
+
# # => verify fails
|
198
|
+
# May be used with parameter matchers in Mocha::ParameterMatchers.
|
199
|
+
#
|
160
200
|
# If a +parameter_block+ is given, the block is called with the parameters passed to the expected method.
|
161
201
|
# The expectation is matched if the block evaluates to +true+.
|
162
202
|
# object = mock()
|
163
203
|
# object.expects(:expected_method).with() { |value| value % 4 == 0 }
|
164
|
-
# object.expected_method(16)
|
204
|
+
# object.expected_method(16)
|
205
|
+
# # => verify succeeds
|
165
206
|
#
|
166
207
|
# object = mock()
|
167
208
|
# object.expects(:expected_method).with() { |value| value % 4 == 0 }
|
168
|
-
# object.expected_method(17)
|
209
|
+
# object.expected_method(17)
|
210
|
+
# # => verify fails
|
169
211
|
def with(*arguments, ¶meter_block)
|
170
212
|
@parameters, @parameter_block = arguments, parameter_block
|
171
213
|
class << @parameters; def to_s; join(', '); end; end
|
@@ -180,12 +222,42 @@ module Mocha
|
|
180
222
|
# yielded_value = nil
|
181
223
|
# object.expected_method { |value| yielded_value = value }
|
182
224
|
# yielded_value # => 'result'
|
225
|
+
# May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
|
226
|
+
# object = mock()
|
227
|
+
# object.stubs(:expected_method).yields(1).then.yields(2)
|
228
|
+
# yielded_values_from_first_invocation = []
|
229
|
+
# yielded_values_from_second_invocation = []
|
230
|
+
# object.expected_method { |value| yielded_values_from_first_invocation << value } # first invocation
|
231
|
+
# object.expected_method { |value| yielded_values_from_second_invocation << value } # second invocation
|
232
|
+
# yielded_values_from_first_invocation # => [1]
|
233
|
+
# yielded_values_from_second_invocation # => [2]
|
183
234
|
def yields(*parameters)
|
184
|
-
@
|
185
|
-
@parameters_to_yield = parameters
|
235
|
+
@yield_parameters.add(*parameters)
|
186
236
|
self
|
187
237
|
end
|
188
|
-
|
238
|
+
|
239
|
+
# :call-seq: multiple_yields(*parameter_groups) -> expectation
|
240
|
+
#
|
241
|
+
# Modifies expectation so that when the expected method is called, it yields multiple times per invocation with the specified +parameter_groups+.
|
242
|
+
# object = mock()
|
243
|
+
# object.expects(:expected_method).multiple_yields(['result_1', 'result_2'], ['result_3'])
|
244
|
+
# yielded_values = []
|
245
|
+
# object.expected_method { |*values| yielded_values << values }
|
246
|
+
# yielded_values # => [['result_1', 'result_2'], ['result_3]]
|
247
|
+
# May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
|
248
|
+
# object = mock()
|
249
|
+
# object.stubs(:expected_method).multiple_yields([1, 2], [3]).then.multiple_yields([4], [5, 6])
|
250
|
+
# yielded_values_from_first_invocation = []
|
251
|
+
# yielded_values_from_second_invocation = []
|
252
|
+
# object.expected_method { |*values| yielded_values_from_first_invocation << values } # first invocation
|
253
|
+
# object.expected_method { |*values| yielded_values_from_second_invocation << values } # second invocation
|
254
|
+
# yielded_values_from_first_invocation # => [[1, 2], [3]]
|
255
|
+
# yielded_values_from_second_invocation # => [[4], [5, 6]]
|
256
|
+
def multiple_yields(*parameter_groups)
|
257
|
+
@yield_parameters.multiple_add(*parameter_groups)
|
258
|
+
self
|
259
|
+
end
|
260
|
+
|
189
261
|
# :call-seq: returns(value) -> expectation
|
190
262
|
# :call-seq: returns(*values) -> expectation
|
191
263
|
#
|
@@ -199,13 +271,30 @@ module Mocha
|
|
199
271
|
# object.stubs(:stubbed_method).returns(1, 2)
|
200
272
|
# object.stubbed_method # => 1
|
201
273
|
# object.stubbed_method # => 2
|
202
|
-
#
|
274
|
+
# May be called multiple times on the same expectation. Also see Expectation#then.
|
275
|
+
# object = mock()
|
276
|
+
# object.stubs(:expected_method).returns(1, 2).then.returns(3)
|
277
|
+
# object.expected_method # => 1
|
278
|
+
# object.expected_method # => 2
|
279
|
+
# object.expected_method # => 3
|
280
|
+
# May be called in conjunction with Expectation#raises on the same expectation.
|
281
|
+
# object = mock()
|
282
|
+
# object.stubs(:expected_method).returns(1, 2).then.raises(Exception)
|
283
|
+
# object.expected_method # => 1
|
284
|
+
# object.expected_method # => 2
|
285
|
+
# object.expected_method # => raises exception of class Exception1
|
286
|
+
# If +value+ is a +Proc+, then the expected method will return the result of calling <tt>Proc#call</tt>.
|
287
|
+
#
|
288
|
+
# This usage is _deprecated_.
|
289
|
+
# Use explicit multiple return values and/or multiple expectations instead.
|
290
|
+
#
|
291
|
+
# A +Proc+ instance will be treated the same as any other value in a future release.
|
203
292
|
# object = mock()
|
204
293
|
# object.stubs(:stubbed_method).returns(lambda { rand(100) })
|
205
294
|
# object.stubbed_method # => 41
|
206
295
|
# object.stubbed_method # => 77
|
207
296
|
def returns(*values)
|
208
|
-
@
|
297
|
+
@return_values += ReturnValues.build(*values)
|
209
298
|
self
|
210
299
|
end
|
211
300
|
|
@@ -215,23 +304,51 @@ module Mocha
|
|
215
304
|
# object = mock()
|
216
305
|
# object.expects(:expected_method).raises(Exception, 'message')
|
217
306
|
# object.expected_method # => raises exception of class Exception and with message 'message'
|
307
|
+
# May be called multiple times on the same expectation. Also see Expectation#then.
|
308
|
+
# object = mock()
|
309
|
+
# object.stubs(:expected_method).raises(Exception1).then.raises(Exception2)
|
310
|
+
# object.expected_method # => raises exception of class Exception1
|
311
|
+
# object.expected_method # => raises exception of class Exception2
|
312
|
+
# May be called in conjunction with Expectation#returns on the same expectation.
|
313
|
+
# object = mock()
|
314
|
+
# object.stubs(:expected_method).raises(Exception).then.returns(2, 3)
|
315
|
+
# object.expected_method # => raises exception of class Exception1
|
316
|
+
# object.expected_method # => 2
|
317
|
+
# object.expected_method # => 3
|
218
318
|
def raises(exception = RuntimeError, message = nil)
|
219
|
-
@
|
319
|
+
@return_values += ReturnValues.new(ExceptionRaiser.new(exception, message))
|
220
320
|
self
|
221
321
|
end
|
222
322
|
|
323
|
+
# :call-seq: then() -> expectation
|
324
|
+
#
|
325
|
+
# Syntactic sugar to improve readability. Has no effect on state of the expectation.
|
326
|
+
# object = mock()
|
327
|
+
# object.stubs(:expected_method).returns(1, 2).then.raises(Exception).then.returns(4)
|
328
|
+
# object.expected_method # => 1
|
329
|
+
# object.expected_method # => 2
|
330
|
+
# object.expected_method # => raises exception of class Exception
|
331
|
+
# object.expected_method # => 4
|
332
|
+
def then
|
333
|
+
self
|
334
|
+
end
|
335
|
+
|
223
336
|
# :stopdoc:
|
224
337
|
|
225
338
|
def invoke
|
226
|
-
@
|
227
|
-
|
228
|
-
|
339
|
+
@invoked_count += 1
|
340
|
+
if block_given? then
|
341
|
+
@yield_parameters.next_invocation.each do |yield_parameters|
|
342
|
+
yield(*yield_parameters)
|
343
|
+
end
|
344
|
+
end
|
345
|
+
@return_values.next
|
229
346
|
end
|
230
347
|
|
231
348
|
def verify
|
232
349
|
yield(self) if block_given?
|
233
|
-
unless (@
|
234
|
-
error = ExpectationError.new(error_message(@
|
350
|
+
unless (@expected_count === @invoked_count) then
|
351
|
+
error = ExpectationError.new(error_message(@expected_count, @invoked_count))
|
235
352
|
error.set_backtrace(filtered_backtrace)
|
236
353
|
raise error
|
237
354
|
end
|
@@ -251,45 +368,11 @@ module Mocha
|
|
251
368
|
end
|
252
369
|
|
253
370
|
def error_message(expected_count, actual_count)
|
254
|
-
"#{@mock.mocha_inspect}.#{method_signature} - expected calls: #{expected_count}, actual calls: #{actual_count}"
|
371
|
+
"#{@mock.mocha_inspect}.#{method_signature} - expected calls: #{expected_count.mocha_inspect}, actual calls: #{actual_count}"
|
255
372
|
end
|
256
373
|
|
257
374
|
# :startdoc:
|
258
375
|
|
259
376
|
end
|
260
377
|
|
261
|
-
# :stopdoc:
|
262
|
-
|
263
|
-
class Stub < Expectation
|
264
|
-
|
265
|
-
def verify
|
266
|
-
true
|
267
|
-
end
|
268
|
-
|
269
|
-
end
|
270
|
-
|
271
|
-
class MissingExpectation < Expectation
|
272
|
-
|
273
|
-
def initialize(mock, method_name)
|
274
|
-
super
|
275
|
-
@invoked = true
|
276
|
-
end
|
277
|
-
|
278
|
-
def verify
|
279
|
-
msg = error_message(0, 1)
|
280
|
-
similar_expectations_list = similar_expectations.collect { |expectation| expectation.method_signature }.join("\n")
|
281
|
-
msg << "\nSimilar expectations:\n#{similar_expectations_list}" unless similar_expectations.empty?
|
282
|
-
error = ExpectationError.new(msg)
|
283
|
-
error.set_backtrace(filtered_backtrace)
|
284
|
-
raise error if @invoked
|
285
|
-
end
|
286
|
-
|
287
|
-
def similar_expectations
|
288
|
-
@mock.expectations.select { |expectation| expectation.method_name == self.method_name }
|
289
|
-
end
|
290
|
-
|
291
|
-
end
|
292
|
-
|
293
|
-
# :startdoc:
|
294
|
-
|
295
378
|
end
|