flexmock 1.3.3 → 2.0.0.rc1

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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.autotest +3 -0
  3. data/.gitignore +14 -0
  4. data/.togglerc +7 -0
  5. data/.travis.yml +5 -0
  6. data/.yardopts +2 -0
  7. data/CHANGES +11 -0
  8. data/Gemfile +1 -4
  9. data/README.md +39 -11
  10. data/Rakefile +6 -217
  11. data/doc/examples/rspec_examples_spec.rb +244 -0
  12. data/doc/examples/test_unit_examples_test.rb +240 -0
  13. data/doc/jamis.rb +591 -0
  14. data/flexmock.gemspec +33 -0
  15. data/lib/flexmock.rb +0 -1
  16. data/lib/flexmock/composite_expectation.rb +1 -1
  17. data/lib/flexmock/core.rb +3 -7
  18. data/lib/flexmock/core_class_methods.rb +5 -1
  19. data/lib/flexmock/default_framework_adapter.rb +2 -2
  20. data/lib/flexmock/expectation.rb +29 -3
  21. data/lib/flexmock/expectation_director.rb +1 -1
  22. data/lib/flexmock/minitest.rb +13 -0
  23. data/lib/flexmock/minitest_extensions.rb +26 -0
  24. data/lib/flexmock/minitest_integration.rb +111 -0
  25. data/lib/flexmock/mock_container.rb +1 -2
  26. data/lib/flexmock/partial_mock.rb +61 -104
  27. data/lib/flexmock/recorder.rb +1 -2
  28. data/lib/flexmock/rspec.rb +6 -3
  29. data/lib/flexmock/test_unit_integration.rb +14 -0
  30. data/lib/flexmock/validators.rb +5 -4
  31. data/lib/flexmock/version.rb +1 -9
  32. data/rakelib/metrics.rake +40 -0
  33. data/rakelib/preview.rake +4 -0
  34. data/rakelib/tags.rake +18 -0
  35. data/todo.txt +20 -0
  36. metadata +61 -86
  37. data/Gemfile.lock +0 -20
  38. data/doc/examples/rspec_examples_spec.rdoc +0 -245
  39. data/doc/examples/test_unit_examples_test.rdoc +0 -241
  40. data/test/aliasing_test.rb +0 -66
  41. data/test/assert_spy_called_test.rb +0 -119
  42. data/test/base_class_test.rb +0 -71
  43. data/test/based_partials_test.rb +0 -51
  44. data/test/container_methods_test.rb +0 -118
  45. data/test/default_framework_adapter_test.rb +0 -38
  46. data/test/demeter_mocking_test.rb +0 -191
  47. data/test/deprecated_methods_test.rb +0 -225
  48. data/test/examples_from_readme_test.rb +0 -157
  49. data/test/expectation_description_test.rb +0 -80
  50. data/test/extended_should_receive_test.rb +0 -69
  51. data/test/flexmodel_test.rb +0 -54
  52. data/test/mock_builder_test.rb +0 -68
  53. data/test/naming_test.rb +0 -84
  54. data/test/new_instances_test.rb +0 -215
  55. data/test/object_extensions_test.rb +0 -25
  56. data/test/partial_mock_test.rb +0 -458
  57. data/test/record_mode_test.rb +0 -158
  58. data/test/redirect_error.rb +0 -16
  59. data/test/rspec_integration/integration_spec.rb +0 -56
  60. data/test/rspec_integration/spy_example_spec.rb +0 -207
  61. data/test/samples_test.rb +0 -283
  62. data/test/should_ignore_missing_test.rb +0 -84
  63. data/test/should_receive_test.rb +0 -1155
  64. data/test/spys_test.rb +0 -215
  65. data/test/symbol_extensions_test.rb +0 -8
  66. data/test/test_class_extensions.rb +0 -34
  67. data/test/test_setup.rb +0 -92
  68. data/test/test_unit_integration/auto_test_unit_test.rb +0 -42
  69. data/test/test_unit_integration/minitest_teardown_test.rb +0 -14
  70. data/test/tu_integration_test.rb +0 -99
  71. data/test/undefined_test.rb +0 -87
data/flexmock.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ require './lib/flexmock/version.rb'
2
+ spec = Gem::Specification.new do |s|
3
+ #### Basic information.
4
+ s.name = 'flexmock'
5
+ s.version = FlexMock::VERSION
6
+ s.summary = "Simple and Flexible Mock Objects for Testing"
7
+ s.description = %{
8
+ FlexMock is a extremely simple mock object class compatible
9
+ with the Minitest framework. Although the FlexMock's
10
+ interface is simple, it is very flexible.
11
+ }
12
+
13
+ s.required_ruby_version = ">= 2.0"
14
+
15
+ s.license = 'MIT'
16
+
17
+ #### Dependencies and requirements.
18
+
19
+ s.add_development_dependency 'minitest'
20
+ s.add_development_dependency 'rake'
21
+
22
+ #### Which files are to be included in this gem? Everything! (Except CVS directories.)
23
+
24
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ s.require_paths = ['lib'] # Use these for libraries.]
26
+
27
+ #### Author and project details.
28
+
29
+ s.authors = ["Jim Weirich", "Sylvain Joyeux"]
30
+ s.email = "sylvain.joyeux@m4x.org"
31
+ s.homepage = "https://github.com/doudou/flexmock"
32
+ end
33
+
data/lib/flexmock.rb CHANGED
@@ -10,4 +10,3 @@
10
10
  #+++
11
11
 
12
12
  require 'flexmock/base'
13
- require 'flexmock/test_unit_integration'
@@ -40,7 +40,7 @@ class FlexMock
40
40
  # applied to the new expectation.
41
41
  def should_receive(*args, &block)
42
42
  @expectations.first.mock.
43
- flexmock_define_expectation(caller.first, *args, &block)
43
+ flexmock_define_expectation(caller, *args, &block)
44
44
  end
45
45
 
46
46
  # Return a string representations
data/lib/flexmock/core.rb CHANGED
@@ -191,8 +191,7 @@ class FlexMock
191
191
  # See Expectation for a list of declarators that can be used.
192
192
  #
193
193
  def should_receive(*args)
194
- location = caller.first
195
- flexmock_define_expectation(location, *args)
194
+ flexmock_define_expectation(caller, *args)
196
195
  end
197
196
 
198
197
  # Using +location+, define the expectations specified by +args+.
@@ -230,13 +229,10 @@ class FlexMock
230
229
  # that the mock name is added to the error message .
231
230
  def flexmock_wrap(&block)
232
231
  yield
233
- rescue FlexMock.framework_adapter.assertion_failed_error => ex
234
- raise FlexMock.framework_adapter.assertion_failed_error,
235
- "in mock '#{@flexmock_name}': #{ex.message}",
236
- ex.backtrace
232
+ rescue FlexMock.framework_adapter.assertion_failed_error, FlexMock.framework_adapter.check_failed_error => ex
233
+ raise ex, "in mock '#{@flexmock_name}': #{ex.message}", ex.backtrace
237
234
  end
238
235
 
239
-
240
236
  # Override the existing definition of method +method_name+ in the
241
237
  # mock. Most methods depend on the method_missing trick to be
242
238
  # invoked. However, if the method already exists, it will not call
@@ -67,7 +67,11 @@ class FlexMock
67
67
  # Check will assert the block returns true. If it doesn't, an
68
68
  # assertion failure is triggered with the given message.
69
69
  def check(msg, &block) # :nodoc:
70
- FlexMock.framework_adapter.make_assertion(msg, &block)
70
+ if FlexMock.framework_adapter.respond_to?(:check)
71
+ FlexMock.framework_adapter.check(msg, &block)
72
+ else
73
+ FlexMock.framework_adapter.make_assertion(msg, &block)
74
+ end
71
75
  end
72
76
 
73
77
  end
@@ -20,8 +20,8 @@ class FlexMock
20
20
  end
21
21
  end
22
22
 
23
- def assert_equal(a, b, msg=nil)
24
- make_assertion(msg || "Expected equal") { a == b }
23
+ def check(msg, &block)
24
+ make_assertion(msg, &block)
25
25
  end
26
26
 
27
27
  class AssertionFailedError < StandardError; end
@@ -68,10 +68,22 @@ class FlexMock
68
68
  result
69
69
  end
70
70
 
71
+ # Validate that this expectation is eligible for an extra call
72
+ def validate_eligible
73
+ @count_validators.each do |v|
74
+ if !v.eligible?(@actual_count)
75
+ v.validate(@actual_count + 1)
76
+ end
77
+ end
78
+ rescue CountValidator::ValidationFailed => e
79
+ FlexMock.framework_adapter.check(e.message) { false }
80
+ end
81
+
71
82
  # Verify the current call with the given arguments matches the
72
83
  # expectations recorded in this object.
73
84
  def verify_call(*args)
74
85
  validate_order
86
+ validate_eligible
75
87
  @actual_count += 1
76
88
  perform_yielding(args)
77
89
  return_value(args)
@@ -140,6 +152,8 @@ class FlexMock
140
152
  @count_validators.each do |v|
141
153
  v.validate(@actual_count)
142
154
  end
155
+ rescue CountValidator::ValidationFailed => e
156
+ FlexMock.framework_adapter.make_assertion(e.message, @location) { false }
143
157
  end
144
158
 
145
159
  # Does the argument list match this expectation's argument
@@ -278,7 +292,15 @@ class FlexMock
278
292
  def pass_thru(&block)
279
293
  block ||= lambda { |value| value }
280
294
  and_return { |*args|
281
- block.call(@mock.flexmock_invoke_original(@sym, args))
295
+ begin
296
+ block.call(@mock.flexmock_invoke_original(@sym, args))
297
+ rescue NoMethodError => e
298
+ if e.name == @sym
299
+ raise e, "#{e.message} while performing #pass_thru in expectation object #{self}"
300
+ else
301
+ raise
302
+ end
303
+ end
282
304
  }
283
305
  end
284
306
 
@@ -417,8 +439,12 @@ class FlexMock
417
439
  def flexmock_location_filter
418
440
  yield
419
441
  rescue Exception => ex
420
- ex.backtrace.insert(0, @location)
421
- raise ex
442
+ bt = @location.dup
443
+ flexmock_dir = File.expand_path(File.dirname(__FILE__))
444
+ while bt.first.start_with?(flexmock_dir)
445
+ bt.shift
446
+ end
447
+ raise ex, ex.message, bt
422
448
  end
423
449
 
424
450
  end
@@ -40,7 +40,7 @@ class FlexMock
40
40
  call_record.expectation = exp if call_record
41
41
  FlexMock.check(
42
42
  "no matching handler found for " +
43
- FlexMock.format_call(@sym, args)) { ! exp.nil? }
43
+ FlexMock.format_call(@sym, args)) { !exp.nil? }
44
44
  returned_value = exp.verify_call(*args)
45
45
  returned_value
46
46
  end
@@ -0,0 +1,13 @@
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
+ require 'flexmock/minitest_integration'
13
+ require 'flexmock/minitest_extensions'
@@ -0,0 +1,26 @@
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
+ begin
13
+ # Minitest 5.0+
14
+ require 'minitest/test'
15
+ class Minitest::Test
16
+ include FlexMock::Minitest
17
+ end
18
+
19
+ rescue LoadError
20
+ # Minitest < 5.0, as shipped with ruby at least up to 2.1
21
+ require 'minitest/unit'
22
+ class MiniTest::Unit::TestCase
23
+ include FlexMock::Minitest
24
+ end
25
+ end
26
+
@@ -0,0 +1,111 @@
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
+ begin
13
+ require 'minitest/assertions'
14
+ rescue LoadError
15
+ require 'minitest/unit'
16
+ end
17
+
18
+ require 'flexmock/base'
19
+ require 'flexmock/test_unit_assert_spy_called'
20
+
21
+ class FlexMock
22
+
23
+ # Minitest::Test Integration.
24
+ #
25
+ # Include this module in any Test subclass (in test-style minitest) or or
26
+ # describe block (in spec-style minitest) to get integration with FlexMock.
27
+ # When this module is included, the mock container methods (e.g. flexmock(),
28
+ # flexstub()) will be available.
29
+ #
30
+ module Minitest
31
+ include ArgumentTypes
32
+ include MockContainer
33
+ include TestUnitAssertions
34
+
35
+ # Teardown the test case, verifying any mocks that might have been
36
+ # defined in this test case.
37
+ def before_teardown
38
+ super
39
+ @flexmock_teardown_failure = nil
40
+ if respond_to?(:capture_exceptions)
41
+ capture_exceptions do
42
+ flexmock_teardown
43
+ end
44
+ else
45
+ begin
46
+ flexmock_teardown
47
+ rescue Exception => e
48
+ @flexmock_teardown_failure = e
49
+ end
50
+ end
51
+ end
52
+
53
+ def after_teardown
54
+ if @flexmock_teardown_failure
55
+ raise @flexmock_teardown_failure
56
+ end
57
+ end
58
+ end
59
+
60
+ class CheckFailedError < RuntimeError; end
61
+
62
+ # Adapter for adapting FlexMock to the Test::Unit framework.
63
+ #
64
+ class MinitestFrameworkAdapter
65
+ if defined?(Minitest::Test)
66
+ include Minitest::Assertions
67
+ else
68
+ include MiniTest::Assertions
69
+ end
70
+
71
+ attr_accessor :assertions
72
+
73
+ def initialize
74
+ @assertions = 0
75
+ end
76
+
77
+ def filtered_backtrace
78
+ bt = caller
79
+ flexmock_dir = File.expand_path(File.dirname(__FILE__))
80
+ while bt.first.start_with?(flexmock_dir)
81
+ bt.shift
82
+ end
83
+ bt
84
+ end
85
+
86
+ def make_assertion(msg, backtrace = caller, &block)
87
+ assert(yield, msg)
88
+ rescue Exception => e
89
+ e.set_backtrace backtrace
90
+ raise e
91
+ end
92
+
93
+ def check(msg, &block)
94
+ unless yield
95
+ msg = msg.call if msg.is_a?(Proc)
96
+ raise CheckFailedError, msg, filtered_backtrace
97
+ end
98
+ end
99
+
100
+ def assertion_failed_error
101
+ MiniTest::Assertion
102
+ end
103
+
104
+ def check_failed_error
105
+ CheckFailedError
106
+ end
107
+ end
108
+
109
+ @framework_adapter = MinitestFrameworkAdapter.new
110
+ end
111
+
@@ -118,9 +118,8 @@ class FlexMock
118
118
  # the mock object.
119
119
  #
120
120
  def flexmock(*args, &block)
121
- location = caller.first
122
121
  @flexmock_worker ||= MockBuilder.new(self)
123
- @flexmock_worker.define_a_mock(location, *args, &block)
122
+ @flexmock_worker.define_a_mock(caller, *args, &block)
124
123
  end
125
124
  alias flexstub flexmock
126
125
 
@@ -28,21 +28,27 @@ class FlexMock
28
28
 
29
29
  attr_reader :mock
30
30
 
31
+ ProxyBox = Struct.new :proxy
32
+
31
33
  # Make a partial mock proxy and install it on the target +obj+.
32
34
  def self.make_proxy_for(obj, container, name, safe_mode)
33
35
  name ||= "flexmock(#{obj.class.to_s})"
34
36
  if ! proxy_defined_on?(obj)
35
37
  mock = FlexMock.new(name, container)
36
38
  proxy = PartialMockProxy.new(obj, mock, safe_mode)
37
- obj.instance_variable_set("@flexmock_proxy", proxy)
39
+ if obj.instance_variable_defined?("@flexmock_proxy")
40
+ obj.instance_variable_get("@flexmock_proxy").proxy = proxy
41
+ else
42
+ obj.instance_variable_set("@flexmock_proxy", ProxyBox.new(proxy))
43
+ end
38
44
  end
39
- obj.instance_variable_get("@flexmock_proxy")
45
+ obj.instance_variable_get("@flexmock_proxy").proxy
40
46
  end
41
47
 
42
48
  # Is there a mock proxy defined on the domain object?
43
49
  def self.proxy_defined_on?(obj)
44
50
  obj.instance_variable_defined?("@flexmock_proxy") &&
45
- obj.instance_variable_get("@flexmock_proxy")
51
+ obj.instance_variable_get("@flexmock_proxy").proxy
46
52
  end
47
53
 
48
54
  # The following methods are added to partial mocks so that they
@@ -61,6 +67,7 @@ class FlexMock
61
67
  @mock = mock
62
68
  @method_definitions = {}
63
69
  @methods_proxied = []
70
+ @proxy_definition_module = nil
64
71
  unless safe_mode
65
72
  add_mock_method(:should_receive)
66
73
  MOCK_METHODS.each do |sym|
@@ -97,8 +104,7 @@ class FlexMock
97
104
  #
98
105
  # See Expectation for a list of declarators that can be used.
99
106
  def should_receive(*args)
100
- location = caller.first
101
- flexmock_define_expectation(location, *args)
107
+ flexmock_define_expectation(caller, *args)
102
108
  end
103
109
 
104
110
  def flexmock_define_expectation(location, *args)
@@ -118,9 +124,9 @@ class FlexMock
118
124
 
119
125
  def add_mock_method(method_name)
120
126
  stow_existing_definition(method_name)
121
- target_class_eval do
127
+ proxy_module_eval do
122
128
  define_method(method_name) { |*args, &block|
123
- proxy = instance_variable_get("@flexmock_proxy") or
129
+ proxy = __flexmock_proxy or
124
130
  fail "Missing FlexMock proxy " +
125
131
  "(for method_name=#{method_name.inspect}, self=\#{self})"
126
132
  proxy.send(method_name, *args, &block)
@@ -149,11 +155,10 @@ class FlexMock
149
155
  def new_instances(*allocators, &block)
150
156
  fail ArgumentError, "new_instances requires a Class to stub" unless
151
157
  Class === @obj
152
- location = caller.first
158
+ location = caller
153
159
  allocators = [:new] if allocators.empty?
154
160
  expectation_recorder = ExpectationRecorder.new
155
161
  allocators.each do |allocate_method|
156
- check_allocate_method(allocate_method)
157
162
  flexmock_define_expectation(location, allocate_method).and_return { |*args|
158
163
  create_new_mocked_object(
159
164
  allocate_method, args, expectation_recorder, block)
@@ -181,8 +186,15 @@ class FlexMock
181
186
  # Invoke the original definition of method on the object supported by
182
187
  # the stub.
183
188
  def flexmock_invoke_original(method, args)
184
- method_proc = @method_definitions[method]
185
- method_proc.call(*args)
189
+ if original_method = @method_definitions[method]
190
+ if Proc === args.last
191
+ block = args.last
192
+ args = args[0..-2]
193
+ end
194
+ original_method.bind(@obj).call(*args, &block)
195
+ else
196
+ @obj.__send__(:method_missing, method, *args, &block)
197
+ end
186
198
  end
187
199
 
188
200
  # Verify that the mock has been properly called. After verification,
@@ -194,11 +206,16 @@ class FlexMock
194
206
  # Remove all traces of the mocking framework from the existing object.
195
207
  def flexmock_teardown
196
208
  if ! detached?
197
- @methods_proxied.each do |method_name|
198
- remove_current_method(method_name)
199
- restore_original_definition(method_name)
209
+ proxy_module_eval do
210
+ methods = instance_methods(false).to_a
211
+ methods.each do |m|
212
+ remove_method m
213
+ end
214
+ end
215
+ if @obj.instance_variable_defined?(:@flexmock_proxy) &&
216
+ (box = @obj.instance_variable_get(:@flexmock_proxy))
217
+ box.proxy = nil
200
218
  end
201
- @obj.instance_variable_set("@flexmock_proxy", nil)
202
219
  @obj = nil
203
220
  end
204
221
  end
@@ -235,16 +252,9 @@ class FlexMock
235
252
 
236
253
  private
237
254
 
238
- def check_allocate_method(allocate_method)
239
- if allocate_method == :allocate && RUBY_VERSION >= "1.9"
240
- fail UsageError,
241
- "Cannot mock the allocation method using new_instances in Ruby 1.9"
242
- end
243
- end
244
-
245
255
  # The singleton class of the object.
246
256
  def target_singleton_class
247
- class << @obj; self; end
257
+ @obj.singleton_class
248
258
  end
249
259
 
250
260
  # Evaluate a block (or string) in the context of the singleton
@@ -253,8 +263,20 @@ class FlexMock
253
263
  target_singleton_class.class_eval(*args, &block)
254
264
  end
255
265
 
256
- def singleton?(method_name)
257
- @obj.flexmock_singleton_defined?(method_name)
266
+ # Evaluate a block into the module we use to define the proxy methods
267
+ def proxy_module_eval(*args, &block)
268
+ if !@proxy_definition_module
269
+ obj = @obj
270
+ @proxy_definition_module = m = Module.new do
271
+ define_method(:__flexmock_proxy) do
272
+ if box = obj.instance_variable_get(:@flexmock_proxy)
273
+ box.proxy
274
+ end
275
+ end
276
+ end
277
+ target_class_eval { prepend m }
278
+ end
279
+ @proxy_definition_module.class_eval(*args, &block)
258
280
  end
259
281
 
260
282
  # Hide the existing method definition with a singleton defintion
@@ -271,109 +293,44 @@ class FlexMock
271
293
  # Stow the existing method definition so that it can be recovered
272
294
  # later.
273
295
  def stow_existing_definition(method_name)
274
- @methods_proxied << method_name
275
- new_alias = create_alias_for_existing_method(method_name)
276
- if new_alias
277
- @method_definitions[method_name] = create_aliased_definition(@obj, new_alias)
278
- end
279
- remove_current_method(method_name) if singleton?(method_name)
280
- end
281
-
282
- # Create a method definition that invokes the original behavior
283
- # via the alias.
284
- def create_aliased_definition(my_object, new_alias)
285
- Proc.new { |*args|
286
- block = nil
287
- if Proc === args.last
288
- block = args.last
289
- args = args[0...-1]
290
- end
291
- my_object.send(new_alias, *args, &block)
292
- }
293
- end
294
- private :create_aliased_definition
295
-
296
- # Create an alias for the existing +method_name+. Returns the new
297
- # alias name. If the aliasing process fails (because the method
298
- # doesn't really exist, then return nil.
299
- def create_alias_for_existing_method(method_name)
300
- new_alias = new_name(method_name)
301
- unless @obj.respond_to?(new_alias)
302
- safe_alias_method(new_alias, method_name)
303
- end
304
- new_alias
305
- end
306
-
307
- # Create an alias for the existing method named +method_name+. It
308
- # is possible that +method_name+ is implemented via a
309
- # meta-programming, so we provide for the case that the
310
- # method_name does not exist.
311
- def safe_alias_method(new_alias, method_name)
312
- target_class_eval do
313
- begin
314
- alias_method(new_alias, method_name)
315
- rescue NameError
316
- nil
317
- end
296
+ if !@methods_proxied.include?(method_name)
297
+ @method_definitions[method_name] = target_class_eval { instance_method(method_name) }
298
+ @methods_proxied << method_name
318
299
  end
300
+ rescue NameError
319
301
  end
320
302
 
321
303
  # Define a proxy method that forwards to our mock object. The
322
304
  # proxy method is defined as a singleton method on the object
323
305
  # being mocked.
324
306
  def define_proxy_method(method_name)
325
- if method_name.to_s =~ /=$/
326
- eval_line = __LINE__ + 1
327
- target_class_eval %{
328
- def #{method_name}(*args, &block)
329
- instance_variable_get('@flexmock_proxy').
330
- mock.__send__(:#{method_name}, *args, &block)
307
+ if method_name =~ /=$/
308
+ proxy_module_eval do
309
+ define_method(method_name) do |*args, &block|
310
+ __flexmock_proxy.mock.__send__(method_name, *args, &block)
331
311
  end
332
- }, __FILE__, eval_line
312
+ end
333
313
  else
334
- eval_line = __LINE__ + 1
335
- target_class_eval %{
314
+ proxy_module_eval <<-EOD
336
315
  def #{method_name}(*args, &block)
337
- instance_variable_get('@flexmock_proxy').
338
- mock.#{method_name}(*args, &block)
316
+ __flexmock_proxy.mock.#{method_name}(*args, &block)
339
317
  end
340
- }, __FILE__, eval_line
341
- _ = true # make rcov recognize the above eval is covered
318
+ EOD
342
319
  end
343
320
  end
344
321
 
345
322
  # Restore the original singleton defintion for method_name that
346
323
  # was saved earlier.
347
324
  def restore_original_definition(method_name)
348
- begin
349
- method_def = @method_definitions[method_name]
350
- if method_def
351
- the_alias = new_name(method_name)
352
- target_class_eval do
353
- alias_method(method_name, the_alias)
354
- end
355
- end
356
- rescue NameError => _
357
- # Alias attempt failed
358
- nil
325
+ proxy_module_eval do
326
+ remove_method method_name
359
327
  end
360
328
  end
361
329
 
362
- # Remove the current method if it is a singleton method of the
363
- # object being mocked.
364
- def remove_current_method(method_name)
365
- target_class_eval { remove_method(method_name) }
366
- end
367
-
368
330
  # Have we been detached from the existing object?
369
331
  def detached?
370
332
  @obj.nil?
371
333
  end
372
334
 
373
- # Generate a name to be used to alias the original behavior.
374
- def new_name(old_name)
375
- "flexmock_original_behavior_for_#{old_name}"
376
- end
377
-
378
335
  end
379
336
  end