flexmock 1.3.2 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile.lock +9 -9
- data/Rakefile +3 -1
- data/lib/flexmock.rb +1 -1
- data/lib/flexmock/argument_matchers.rb +1 -1
- data/lib/flexmock/argument_types.rb +1 -2
- data/lib/flexmock/base.rb +2 -1
- data/lib/flexmock/call_record.rb +30 -0
- data/lib/flexmock/call_validator.rb +68 -0
- data/lib/flexmock/composite_expectation.rb +56 -0
- data/lib/flexmock/core.rb +30 -64
- data/lib/flexmock/core_class_methods.rb +1 -1
- data/lib/flexmock/default_framework_adapter.rb +1 -1
- data/lib/flexmock/deprecated_methods.rb +8 -3
- data/lib/flexmock/errors.rb +1 -1
- data/lib/flexmock/expectation.rb +7 -84
- data/lib/flexmock/expectation_builder.rb +133 -0
- data/lib/flexmock/expectation_director.rb +6 -4
- data/lib/flexmock/expectation_recorder.rb +42 -0
- data/lib/flexmock/extensions/active_record_model.rb +109 -0
- data/lib/flexmock/mock_builder.rb +139 -0
- data/lib/flexmock/mock_container.rb +13 -214
- data/lib/flexmock/noop.rb +1 -1
- data/lib/flexmock/ordering.rb +1 -2
- data/lib/flexmock/partial_mock.rb +95 -57
- data/lib/flexmock/rails.rb +1 -1
- data/lib/flexmock/recorder.rb +4 -3
- data/lib/flexmock/rspec.rb +1 -1
- data/lib/flexmock/rspec_spy_matcher.rb +4 -0
- data/lib/flexmock/spy_describers.rb +22 -5
- data/lib/flexmock/test_unit.rb +2 -40
- data/lib/flexmock/test_unit_integration.rb +4 -4
- data/lib/flexmock/test_unit_testcase_extensions.rb +49 -0
- data/lib/flexmock/undefined.rb +1 -1
- data/lib/flexmock/validators.rb +18 -12
- data/lib/flexmock/version.rb +1 -1
- data/test/based_partials_test.rb +1 -1
- data/test/container_methods_test.rb +1 -1
- data/test/default_framework_adapter_test.rb +1 -1
- data/test/demeter_mocking_test.rb +52 -2
- data/test/deprecated_methods_test.rb +1 -1
- data/test/examples_from_readme_test.rb +1 -1
- data/test/expectation_description_test.rb +1 -1
- data/test/extended_should_receive_test.rb +1 -1
- data/test/mock_builder_test.rb +68 -0
- data/test/naming_test.rb +1 -1
- data/test/new_instances_test.rb +1 -1
- data/test/partial_mock_test.rb +23 -6
- data/test/record_mode_test.rb +1 -1
- data/test/rspec_integration/integration_spec.rb +1 -1
- data/test/samples_test.rb +1 -2
- data/test/should_ignore_missing_test.rb +1 -1
- data/test/should_receive_test.rb +1 -1
- data/test/test_setup.rb +17 -0
- data/test/test_unit_integration/auto_test_unit_test.rb +1 -1
- data/test/tu_integration_test.rb +1 -1
- data/test/undefined_test.rb +1 -1
- metadata +52 -52
- data/TAGS +0 -1056
- data/lib/flexmock/composite.rb +0 -10
- data/lib/flexmock/rails/view_mocking.rb +0 -144
- data/test/rails_view_stub_test.rb +0 -145
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c8fc2db94cd104d7f780ee838c07b73a09649317
|
4
|
+
data.tar.gz: 18c344caf1b37f52f0226b563e8c18fe2832d46f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: aaa6e22a1f390003d539e753d1ebbed9f20e37ce2fb825f39cd1032811f3084236ee4bb591e52644a1eb0bf09d173bda64f9169e619f75a4bf033c70279c51e3
|
7
|
+
data.tar.gz: f106c0edb36b898a2907a7e5930b078a6d36ee7389081ce3fc9a192aad29ebe785ff8d848953ba84955449c37405bd75396cd662db375134fe364f8c0e2a5370
|
data/Gemfile.lock
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
diff-lcs (1.2.
|
5
|
-
rake (10.0
|
6
|
-
rspec (2.
|
7
|
-
rspec-core (~> 2.
|
8
|
-
rspec-expectations (~> 2.
|
9
|
-
rspec-mocks (~> 2.
|
10
|
-
rspec-core (2.
|
11
|
-
rspec-expectations (2.
|
4
|
+
diff-lcs (1.2.5)
|
5
|
+
rake (10.1.0)
|
6
|
+
rspec (2.14.1)
|
7
|
+
rspec-core (~> 2.14.0)
|
8
|
+
rspec-expectations (~> 2.14.0)
|
9
|
+
rspec-mocks (~> 2.14.0)
|
10
|
+
rspec-core (2.14.7)
|
11
|
+
rspec-expectations (2.14.4)
|
12
12
|
diff-lcs (>= 1.1.3, < 2.0)
|
13
|
-
rspec-mocks (2.
|
13
|
+
rspec-mocks (2.14.4)
|
14
14
|
|
15
15
|
PLATFORMS
|
16
16
|
ruby
|
data/Rakefile
CHANGED
@@ -100,7 +100,9 @@ end
|
|
100
100
|
task :rdoc => ["html/index.html", :fixcss]
|
101
101
|
|
102
102
|
file "html/index.html" => ["Rakefile"] + RDOC_FILES do
|
103
|
-
|
103
|
+
Bundler.with_clean_env do
|
104
|
+
sh "rdoc -o html --title FlexMock --line-numbers -m doc/index.rdoc #{RDOC_FILES}"
|
105
|
+
end
|
104
106
|
end
|
105
107
|
|
106
108
|
EXAMPLE_RB.zip(EXAMPLE_DOC).each do |source, target|
|
data/lib/flexmock.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
#---
|
4
|
-
# Copyright 2003-
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
5
|
# All rights reserved.
|
6
6
|
|
7
7
|
# Permission is granted for use, copying, modification, distribution,
|
@@ -13,7 +13,6 @@ require 'flexmock/argument_matchers'
|
|
13
13
|
|
14
14
|
class FlexMock
|
15
15
|
|
16
|
-
####################################################################
|
17
16
|
# Include this module in your test class if you wish to use the +eq+
|
18
17
|
# and +any+ argument matching methods without a prefix. (Otherwise
|
19
18
|
# use <tt>FlexMock.any</tt> and <tt>FlexMock.eq(obj)</tt>.
|
data/lib/flexmock/base.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
#---
|
4
|
-
# Copyright 2003-
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
5
|
# All rights reserved.
|
6
6
|
|
7
7
|
# Permission is granted for use, copying, modification, distribution,
|
@@ -26,3 +26,4 @@ require 'flexmock/mock_container'
|
|
26
26
|
require 'flexmock/partial_mock'
|
27
27
|
require 'flexmock/undefined'
|
28
28
|
require 'flexmock/deprecated_methods'
|
29
|
+
require 'flexmock/extensions/active_record_model'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#---
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
|
+
# All rights reserved.
|
6
|
+
#
|
7
|
+
# Permission is granted for use, copying, modification, distribution,
|
8
|
+
# and distribution of modified versions of this work as long as the
|
9
|
+
# above copyright notice is included.
|
10
|
+
#+++
|
11
|
+
|
12
|
+
class FlexMock
|
13
|
+
|
14
|
+
CallRecord = Struct.new(:method_name, :args, :block_given, :expectation) do
|
15
|
+
def matches?(sym, actual_args, options)
|
16
|
+
method_name == sym &&
|
17
|
+
ArgumentMatching.all_match?(actual_args, args) &&
|
18
|
+
matches_block?(options[:with_block])
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def matches_block?(block_option)
|
24
|
+
block_option.nil? ||
|
25
|
+
(block_option && block_given) ||
|
26
|
+
(!block_option && !block_given)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#---
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
|
+
# All rights reserved.
|
6
|
+
#
|
7
|
+
# Permission is granted for use, copying, modification, distribution,
|
8
|
+
# and distribution of modified versions of this work as long as the
|
9
|
+
# above copyright notice is included.
|
10
|
+
#+++
|
11
|
+
|
12
|
+
class FlexMock
|
13
|
+
|
14
|
+
# A CallValidator checks the list of call records for a particular
|
15
|
+
# method name and arguments.
|
16
|
+
class CallValidator
|
17
|
+
|
18
|
+
# Does the +calls+ list record a method named +method_name+ with
|
19
|
+
# +args+. Options include:
|
20
|
+
#
|
21
|
+
# * :times => n -- If given, the call should match exactly +n+ times.
|
22
|
+
# * :and => [] -- A list of argument validations to be run on each
|
23
|
+
# matching invocation.
|
24
|
+
# * :on_count => n -- If given, the :and validations on only run on the
|
25
|
+
# nth invocation.
|
26
|
+
#
|
27
|
+
def received?(calls, method_name, args, options)
|
28
|
+
count = 0
|
29
|
+
calls.each { |call_record|
|
30
|
+
if call_record.matches?(method_name, args, options)
|
31
|
+
count += 1
|
32
|
+
run_additional_validations(call_record, count, options)
|
33
|
+
end
|
34
|
+
}
|
35
|
+
count_matches?(count, options[:times])
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def additionals(options)
|
41
|
+
ands = options[:and]
|
42
|
+
if ands.nil?
|
43
|
+
[]
|
44
|
+
elsif ands.is_a?(Proc)
|
45
|
+
[ands]
|
46
|
+
else
|
47
|
+
ands
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def run_additional_validations(call_record, count, options)
|
52
|
+
if options[:on_count].nil? || count == options[:on_count]
|
53
|
+
additionals(options).each do |add|
|
54
|
+
add.call(*call_record.args)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def count_matches?(count, times)
|
60
|
+
if times
|
61
|
+
count == times
|
62
|
+
else
|
63
|
+
count > 0
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class FlexMock
|
2
|
+
|
3
|
+
# A composite expectation allows several expectations to be grouped into a
|
4
|
+
# single composite and then apply the same constraints to all expectations
|
5
|
+
# in the group.
|
6
|
+
class CompositeExpectation
|
7
|
+
|
8
|
+
# Initialize the composite expectation.
|
9
|
+
def initialize
|
10
|
+
@expectations = []
|
11
|
+
end
|
12
|
+
|
13
|
+
# Add an expectation to the composite.
|
14
|
+
def add(expectation)
|
15
|
+
@expectations << expectation
|
16
|
+
end
|
17
|
+
|
18
|
+
# Apply the constraint method to all expectations in the composite.
|
19
|
+
def method_missing(sym, *args, &block)
|
20
|
+
@expectations.each do |expectation|
|
21
|
+
expectation.send(sym, *args, &block)
|
22
|
+
end
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
# The following methods return a value, so we make an arbitrary choice
|
27
|
+
# and return the value for the first expectation in the composite.
|
28
|
+
|
29
|
+
# Return the order number of the first expectation in the list.
|
30
|
+
def order_number
|
31
|
+
@expectations.first.order_number
|
32
|
+
end
|
33
|
+
|
34
|
+
# Return the associated mock object.
|
35
|
+
def mock
|
36
|
+
@expectations.first.mock
|
37
|
+
end
|
38
|
+
|
39
|
+
# Start a new method expectation. The following constraints will be
|
40
|
+
# applied to the new expectation.
|
41
|
+
def should_receive(*args, &block)
|
42
|
+
@expectations.first.mock.
|
43
|
+
flexmock_define_expectation(caller.first, *args, &block)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Return a string representations
|
47
|
+
def to_s
|
48
|
+
if @expectations.size > 1
|
49
|
+
"[" + @expectations.collect { |e| e.to_s }.join(', ') + "]"
|
50
|
+
else
|
51
|
+
@expectations.first.to_s
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
data/lib/flexmock/core.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
#---
|
4
|
-
# Copyright 2003-
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
5
|
# All rights reserved.
|
6
6
|
#
|
7
7
|
# Permission is granted for use, copying, modification, distribution,
|
@@ -10,17 +10,16 @@
|
|
10
10
|
#+++
|
11
11
|
|
12
12
|
require 'flexmock/errors'
|
13
|
-
require 'flexmock/composite'
|
14
13
|
require 'flexmock/ordering'
|
15
14
|
require 'flexmock/argument_matching'
|
16
15
|
require 'flexmock/explicit_needed'
|
17
16
|
require 'flexmock/class_extensions'
|
17
|
+
require 'flexmock/expectation_builder'
|
18
|
+
require 'flexmock/call_validator'
|
19
|
+
require 'flexmock/call_record'
|
18
20
|
|
19
|
-
|
20
|
-
#
|
21
|
-
#
|
22
|
-
# FlexMock has a simple interface that's easy to remember, and leaves
|
23
|
-
# the hard stuff to all those other mock object implementations.
|
21
|
+
# FlexMock is a flexible mock object framework for creating and using
|
22
|
+
# test doubles (mocks, stubs and spies).
|
24
23
|
#
|
25
24
|
# Basic Usage:
|
26
25
|
#
|
@@ -33,8 +32,6 @@ require 'flexmock/class_extensions'
|
|
33
32
|
# With Test::Unit Integration:
|
34
33
|
#
|
35
34
|
# class TestSomething < Test::Unit::TestCase
|
36
|
-
# include FlexMock::TestCase
|
37
|
-
#
|
38
35
|
# def test_something
|
39
36
|
# m = flexmock("name")
|
40
37
|
# m.should_receive(:hi).and_return("Hello")
|
@@ -42,9 +39,7 @@ require 'flexmock/class_extensions'
|
|
42
39
|
# end
|
43
40
|
# end
|
44
41
|
#
|
45
|
-
# Note:
|
46
|
-
# FlexMock::TestCase. Also, if you override +teardown+, make sure you
|
47
|
-
# call +super+.
|
42
|
+
# Note: Also, if you override +teardown+, make sure you call +super+.
|
48
43
|
#
|
49
44
|
class FlexMock
|
50
45
|
include Ordering
|
@@ -104,22 +99,6 @@ class FlexMock
|
|
104
99
|
self
|
105
100
|
end
|
106
101
|
|
107
|
-
CallRecord = Struct.new(:method_name, :args, :block_given, :expectation) do
|
108
|
-
def matches?(sym, actual_args, options)
|
109
|
-
method_name == sym &&
|
110
|
-
ArgumentMatching.all_match?(actual_args, args) &&
|
111
|
-
matches_block?(options[:with_block])
|
112
|
-
end
|
113
|
-
|
114
|
-
private
|
115
|
-
|
116
|
-
def matches_block?(block_option)
|
117
|
-
block_option.nil? ||
|
118
|
-
(block_option && block_given) ||
|
119
|
-
(!block_option && !block_given)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
102
|
# Handle missing methods by attempting to look up a handler.
|
124
103
|
def method_missing(sym, *args, &block)
|
125
104
|
enhanced_args = block_given? ? args + [block] : args
|
@@ -162,25 +141,11 @@ class FlexMock
|
|
162
141
|
should_receive(:class => base_class)
|
163
142
|
end
|
164
143
|
|
144
|
+
CALL_VALIDATOR = CallValidator.new
|
145
|
+
|
165
146
|
# True if the mock received the given method and arguments.
|
166
|
-
def flexmock_received?(
|
167
|
-
|
168
|
-
additional = options[:and] || []
|
169
|
-
additional = [additional] if additional.is_a?(Proc)
|
170
|
-
@calls.each { |call_record|
|
171
|
-
if call_record.matches?(sym, args, options)
|
172
|
-
count += 1
|
173
|
-
if options[:on_count].nil? || count == options[:on_count]
|
174
|
-
additional.each do |add| add.call(*call_record.args) end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
}
|
178
|
-
if options[:times]
|
179
|
-
result = count == options[:times]
|
180
|
-
else
|
181
|
-
result = count > 0
|
182
|
-
end
|
183
|
-
result
|
147
|
+
def flexmock_received?(method_name, args, options={})
|
148
|
+
CALL_VALIDATOR.received?(@calls, method_name, args, options)
|
184
149
|
end
|
185
150
|
|
186
151
|
# Return the list of calls made on this mock. Used in formatting
|
@@ -191,13 +156,13 @@ class FlexMock
|
|
191
156
|
|
192
157
|
# Invocke the original non-mocked functionality for the given
|
193
158
|
# symbol.
|
194
|
-
def flexmock_invoke_original(
|
159
|
+
def flexmock_invoke_original(method_name, args)
|
195
160
|
return FlexMock.undefined
|
196
161
|
end
|
197
162
|
|
198
163
|
# Override the built-in +method+ to include the mocked methods.
|
199
|
-
def method(
|
200
|
-
@expectations[
|
164
|
+
def method(method_name)
|
165
|
+
@expectations[method_name] || super
|
201
166
|
rescue NameError => ex
|
202
167
|
if @ignore_missing
|
203
168
|
proc { FlexMock.undefined }
|
@@ -230,14 +195,15 @@ class FlexMock
|
|
230
195
|
flexmock_define_expectation(location, *args)
|
231
196
|
end
|
232
197
|
|
198
|
+
# Using +location+, define the expectations specified by +args+.
|
233
199
|
def flexmock_define_expectation(location, *args)
|
234
|
-
@last_expectation =
|
235
|
-
@expectations[
|
236
|
-
result = Expectation.new(self,
|
237
|
-
@expectations[
|
238
|
-
override_existing_method(
|
239
|
-
result = ExplicitNeeded.new(result,
|
240
|
-
@base_class && ! @base_class.flexmock_defined?(
|
200
|
+
@last_expectation = EXP_BUILDER.parse_should_args(self, args) do |method_name|
|
201
|
+
@expectations[method_name] ||= ExpectationDirector.new(method_name)
|
202
|
+
result = Expectation.new(self, method_name, location)
|
203
|
+
@expectations[method_name] << result
|
204
|
+
override_existing_method(method_name) if flexmock_respond_to?(method_name)
|
205
|
+
result = ExplicitNeeded.new(result, method_name, @base_class) if
|
206
|
+
@base_class && ! @base_class.flexmock_defined?(method_name)
|
241
207
|
result
|
242
208
|
end
|
243
209
|
end
|
@@ -271,15 +237,15 @@ class FlexMock
|
|
271
237
|
end
|
272
238
|
|
273
239
|
|
274
|
-
# Override the existing definition of method +
|
275
|
-
# Most methods depend on the method_missing trick to be
|
276
|
-
# However, if the method already exists, it will not call
|
277
|
-
# method_missing.
|
278
|
-
#
|
279
|
-
def override_existing_method(
|
240
|
+
# Override the existing definition of method +method_name+ in the
|
241
|
+
# mock. Most methods depend on the method_missing trick to be
|
242
|
+
# invoked. However, if the method already exists, it will not call
|
243
|
+
# method_missing. This method defines a singleton method on the mock
|
244
|
+
# to explicitly invoke the method_missing logic.
|
245
|
+
def override_existing_method(method_name)
|
280
246
|
sclass.class_eval <<-EOS
|
281
|
-
def #{
|
282
|
-
method_missing(:#{
|
247
|
+
def #{method_name}(*args, &block)
|
248
|
+
method_missing(:#{method_name}, *args, &block)
|
283
249
|
end
|
284
250
|
EOS
|
285
251
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
#---
|
4
|
-
# Copyright 2003-
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
5
|
# All rights reserved.
|
6
6
|
#
|
7
7
|
# Permission is granted for use, copying, modification, distribution,
|
@@ -38,7 +38,8 @@ class FlexMock
|
|
38
38
|
# that by passing in the number of expected calls as a second
|
39
39
|
# paramter.
|
40
40
|
def mock_handle(sym, expected_count=nil, &block) # :nodoc:
|
41
|
-
$stderr.puts "mock_handle is deprecated,
|
41
|
+
$stderr.puts "mock_handle is deprecated, " +
|
42
|
+
"use the new should_receive interface instead."
|
42
43
|
self.should_receive(sym).times(expected_count).returns(&block)
|
43
44
|
end
|
44
45
|
|
@@ -57,6 +58,10 @@ class FlexMock
|
|
57
58
|
end
|
58
59
|
|
59
60
|
module Ordering
|
60
|
-
flexmock_deprecate
|
61
|
+
flexmock_deprecate(
|
62
|
+
:mock_allocate_order,
|
63
|
+
:mock_groups,
|
64
|
+
:mock_current_order,
|
65
|
+
:mock_validate_order)
|
61
66
|
end
|
62
67
|
end
|