flexmock 1.0.0.beta.1 → 1.0.0.beta.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +22 -9
- data/README.rdoc +91 -85
- data/Rakefile +3 -2
- data/doc/releases/flexmock-1.0.0.rdoc +8 -0
- data/lib/flexmock/partial_mock.rb +28 -16
- data/lib/flexmock/version.rb +1 -1
- data/test/partial_mock_test.rb +37 -1
- metadata +2 -2
data/CHANGES
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
= Changes for FlexMock
|
2
2
|
|
3
|
+
== Version 1.0.0
|
4
|
+
|
5
|
+
* Added spy support.
|
6
|
+
* Added base class mocking restrictions.
|
7
|
+
* Using singleton_methods to get list of singleton methods (rather
|
8
|
+
than methods(false))
|
9
|
+
* Correctly handling mocking methods that were meta-programmed with
|
10
|
+
method_missing.
|
11
|
+
|
12
|
+
== Version 0.9.0
|
13
|
+
|
14
|
+
* Ruby 1.9.3 compatibility changes.
|
15
|
+
|
3
16
|
== Version 0.8.5
|
4
17
|
|
5
18
|
* Fixed warning about a void context.
|
@@ -45,7 +58,7 @@
|
|
45
58
|
|
46
59
|
* Updated install.rb to handle non-root destination directories via
|
47
60
|
DESTDIR.
|
48
|
-
* Fixed operator bug introduced in 0.7.0.
|
61
|
+
* Fixed operator bug introduced in 0.7.0.
|
49
62
|
|
50
63
|
== Version 0.7.0
|
51
64
|
|
@@ -79,15 +92,15 @@
|
|
79
92
|
where mock support methods in the domain object would cause
|
80
93
|
problems.
|
81
94
|
|
82
|
-
* Internally renamed PartialMock to PartialMockProxy.
|
83
|
-
|
95
|
+
* Internally renamed PartialMock to PartialMockProxy.
|
96
|
+
|
84
97
|
== Version 0.6.2
|
85
98
|
|
86
99
|
* flexmock() with a block now always returns the domain object.
|
87
100
|
flexmock() without a block returns the mock object. Note that for
|
88
101
|
normal mocks, the domain and mock objects are the same. For partial
|
89
102
|
mocks, the mock is separate from the domain object.
|
90
|
-
* Added +and_raise+ to the list of expection specifications.
|
103
|
+
* Added +and_raise+ to the list of expection specifications.
|
91
104
|
|
92
105
|
== Version 0.6.1
|
93
106
|
|
@@ -105,7 +118,7 @@
|
|
105
118
|
|
106
119
|
== Version 0.5.1
|
107
120
|
|
108
|
-
* Changed the name of any_instance to new_instances.
|
121
|
+
* Changed the name of any_instance to new_instances.
|
109
122
|
Deprecated any_instance.
|
110
123
|
* Added ability to stub any class method in new_instances.
|
111
124
|
* Added RCov task
|
@@ -128,12 +141,12 @@
|
|
128
141
|
== Version 0.4.3
|
129
142
|
|
130
143
|
* Fixed bug where non-direct class methods were not properly handled.
|
131
|
-
|
144
|
+
|
132
145
|
== Version 0.4.2
|
133
146
|
|
134
147
|
* Fixed bug where multiple stubs of a class method were not
|
135
148
|
properly restored.
|
136
|
-
|
149
|
+
|
137
150
|
== Version 0.4.1
|
138
151
|
|
139
152
|
* Removed include of Test::Unit::Assertions from Expectations.
|
@@ -167,8 +180,8 @@
|
|
167
180
|
* Added strict mode in record mode interface to facility using known
|
168
181
|
good algorithms for comparison testing.
|
169
182
|
* Improved the docs and examples. Fixed garbled first example in
|
170
|
-
README.
|
171
|
-
|
183
|
+
README.
|
184
|
+
|
172
185
|
== Version 0.2.0
|
173
186
|
|
174
187
|
* Added record mode for building expectations.
|
data/README.rdoc
CHANGED
@@ -3,15 +3,14 @@
|
|
3
3
|
FlexMock is a simple, but flexible, mock object library for Ruby unit
|
4
4
|
testing.
|
5
5
|
|
6
|
-
Version :: 1.0.0.beta.
|
6
|
+
Version :: 1.0.0.beta.2
|
7
7
|
|
8
8
|
= Links
|
9
9
|
|
10
|
-
<b>Documents</b>
|
11
|
-
<b>RubyGems</b>
|
12
|
-
<b>
|
13
|
-
<b>Issue Tracking</b> ::
|
14
|
-
<b>Bug Reports</b> :: http://onestepback.org/cgi-bin/bugs.cgi?project=flexmock
|
10
|
+
<b>Documents</b> :: http://flexmock.rubyforge.org
|
11
|
+
<b>RubyGems</b> :: Install with: <b>gem install flexmock</b>
|
12
|
+
<b>Source</b> :: https://github.com/jimweirich/flexmock
|
13
|
+
<b>Bug Reports and Issue Tracking</b> :: https://github.com/jimweirich/flexmock/issues
|
15
14
|
|
16
15
|
== Installation
|
17
16
|
|
@@ -78,11 +77,11 @@ Your test case will look something like this:
|
|
78
77
|
end
|
79
78
|
end
|
80
79
|
|
81
|
-
<b>NOTE:</b> If you don't want to automatically extend every TestCase
|
82
|
-
flexmock methods and overhead, then require the 'flexmock'
|
83
|
-
include the FlexMock::TestCase module in each test
|
84
|
-
to use mock objects. FlexMock versions prior
|
85
|
-
include.
|
80
|
+
<b>NOTE:</b> If you don't want to automatically extend every TestCase
|
81
|
+
with the flexmock methods and overhead, then require the 'flexmock'
|
82
|
+
file and explicitly include the FlexMock::TestCase module in each test
|
83
|
+
case class where you wish to use mock objects. FlexMock versions prior
|
84
|
+
to 0.6.0 required the explicit include.
|
86
85
|
|
87
86
|
== RSpec Integration
|
88
87
|
|
@@ -124,14 +123,15 @@ FlexMock::MockContainer#flexmock for more details.
|
|
124
123
|
|
125
124
|
* <b>mock = flexmock(:foo => :bar, :baz => :froz)</b>
|
126
125
|
|
127
|
-
Create a mock object and define two mocked methods (:foo and :baz)
|
128
|
-
return the values :bar and :froz respectively. This is useful
|
129
|
-
mock objects with just a few methods and simple return
|
126
|
+
Create a mock object and define two mocked methods (:foo and :baz)
|
127
|
+
that return the values :bar and :froz respectively. This is useful
|
128
|
+
when creating mock objects with just a few methods and simple return
|
129
|
+
values.
|
130
130
|
|
131
131
|
* <b>mock = flexmock("joe", :foo => :bar, :bar => :froz)</b>
|
132
132
|
|
133
|
-
You can combine the mock name and an expectation hash in the same
|
134
|
-
flexmock.
|
133
|
+
You can combine the mock name and an expectation hash in the same
|
134
|
+
call to flexmock.
|
135
135
|
|
136
136
|
* <b>mock = flexmock("joe", :on, User)</b>
|
137
137
|
|
@@ -148,8 +148,8 @@ FlexMock::MockContainer#flexmock for more details.
|
|
148
148
|
|
149
149
|
If you you give <code>flexmock</code> a real object in the argument
|
150
150
|
list, it will treat that real object as a base for a partial mock
|
151
|
-
object. The return value <code>
|
152
|
-
expectations. The real_object should be used in the reference
|
151
|
+
object. The return value <code>partial_mock</code> may be used to
|
152
|
+
set expectations. The real_object should be used in the reference
|
153
153
|
portion of the test.
|
154
154
|
|
155
155
|
* <b>partial_mock = flexmock(real_object, "name", :foo => :baz)</b>
|
@@ -159,22 +159,23 @@ FlexMock::MockContainer#flexmock for more details.
|
|
159
159
|
* <b>partial_mock = flexmock(:base, real_string_object)</b>
|
160
160
|
|
161
161
|
Since Strings (and Symbols for that matter) are used for mock names,
|
162
|
-
FlexMock will not recognize them as the base for a partial mock. To
|
163
|
-
string to be used as a partial mock base, proceed the string
|
164
|
-
calling sequence with :base.
|
162
|
+
FlexMock will not recognize them as the base for a partial mock. To
|
163
|
+
force a string to be used as a partial mock base, proceed the string
|
164
|
+
object in the calling sequence with :base.
|
165
165
|
|
166
166
|
* <b>partial_mock = flexmock(:safe, real_object) { |mock| mock.should_receive(...) }</b>
|
167
167
|
|
168
168
|
When mocking real objects (i.e. "partial mocks"), FlexMock will add
|
169
169
|
a handful of mock related methods to the actual object (see below
|
170
|
-
for list of method names).
|
171
|
-
collide with an existing method on the partial mock, then there are
|
170
|
+
for list of method names). If one or more of these added methods
|
171
|
+
collide with an existing method on the partial mock, then there are
|
172
|
+
problems.
|
172
173
|
|
173
174
|
FlexMock offers a "safe" mode for partial mocks that does not add
|
174
|
-
these methods.
|
175
|
-
|
176
|
-
|
177
|
-
|
175
|
+
these methods. Indicate safe mode by passing the symbol :safe as the
|
176
|
+
first argument of flexmock. A block <em>is required</em> when using
|
177
|
+
safe mode (the partial_mock returned in safe mode does not have a
|
178
|
+
<code>should_receive</code> method).
|
178
179
|
|
179
180
|
The methods added to partial mocks in non-safe mode are:
|
180
181
|
|
@@ -222,13 +223,14 @@ still available for backward compatibility.
|
|
222
223
|
|
223
224
|
=== Expectation Declarators
|
224
225
|
|
225
|
-
Once a mock is created, you need to define what that mock should
|
226
|
-
see. Expectation declarators are used to specify these
|
227
|
-
upon received method calls. A basic expectation,
|
228
|
-
<code>should_receive</code> method, just establishes
|
229
|
-
not) be called on the mock object.
|
230
|
-
|
231
|
-
expectation and adds constraints
|
226
|
+
Once a mock is created, you need to define what that mock should
|
227
|
+
expect to see. Expectation declarators are used to specify these
|
228
|
+
expectations placed upon received method calls. A basic expectation,
|
229
|
+
created with the <code>should_receive</code> method, just establishes
|
230
|
+
the fact that a method may (or may not) be called on the mock object.
|
231
|
+
Refinements to that expectation may be additionally declared. FlexMock
|
232
|
+
always starts with the most general expectation and adds constraints
|
233
|
+
to that.
|
232
234
|
|
233
235
|
For example, the following code:
|
234
236
|
|
@@ -241,8 +243,8 @@ speaking, the <code>and_return</code> part of the declaration isn't
|
|
241
243
|
exactly a constraint, but it does specify what value the mock will
|
242
244
|
return when the expectation is matched.
|
243
245
|
|
244
|
-
If you want to be more specific, you need to add additional
|
245
|
-
your expectation. Here are some examples:
|
246
|
+
If you want to be more specific, you need to add additional
|
247
|
+
constraints to your expectation. Here are some examples:
|
246
248
|
|
247
249
|
mock.should_receive(:average).with(12).once
|
248
250
|
|
@@ -250,14 +252,15 @@ your expectation. Here are some examples:
|
|
250
252
|
at_least.twice.at_most.times(10).
|
251
253
|
and_return { rand }
|
252
254
|
|
253
|
-
The following methods may be used to create and refine expectations on
|
254
|
-
object. See theFlexMock::Expectation for more details.
|
255
|
+
The following methods may be used to create and refine expectations on
|
256
|
+
a mock object. See theFlexMock::Expectation for more details.
|
255
257
|
|
256
258
|
* <b>should_receive(<em>method_name</em>)</b>
|
257
259
|
|
258
|
-
Declares that a message named <em>method_name</em> will be sent to
|
259
|
-
object. Constraints on this expected message (called
|
260
|
-
chained to the <code>should_receive</code>
|
260
|
+
Declares that a message named <em>method_name</em> will be sent to
|
261
|
+
the mock object. Constraints on this expected message (called
|
262
|
+
expectations) may be chained to the <code>should_receive</code>
|
263
|
+
call.
|
261
264
|
|
262
265
|
* <b>should_receive(<em>method_name1</em>, <em>method_name2</em>, ...)</b>
|
263
266
|
|
@@ -280,9 +283,10 @@ object. See theFlexMock::Expectation for more details.
|
|
280
283
|
|
281
284
|
* <b>should_expect { |<em>recorder</em>| ... }</b>
|
282
285
|
|
283
|
-
Creates a mock recording object that will translate received method
|
284
|
-
into mock expectations. The recorder is passed to a block
|
285
|
-
<code>should_expect</code> method. See examples
|
286
|
+
Creates a mock recording object that will translate received method
|
287
|
+
calls into mock expectations. The recorder is passed to a block
|
288
|
+
supplied with the <code>should_expect</code> method. See examples
|
289
|
+
below.
|
286
290
|
|
287
291
|
* <b>with(<em>arglist</em>)</b>
|
288
292
|
|
@@ -310,8 +314,8 @@ object. See theFlexMock::Expectation for more details.
|
|
310
314
|
|
311
315
|
* <b>once</b>
|
312
316
|
|
313
|
-
Declares that the expected message is only sent once.
|
314
|
-
<tt>at_most</tt> modifiers are allowed.
|
317
|
+
Declares that the expected message is only sent once.
|
318
|
+
<tt>at_least</tt> / <tt>at_most</tt> modifiers are allowed.
|
315
319
|
|
316
320
|
* <b>twice</b>
|
317
321
|
|
@@ -330,25 +334,25 @@ object. See theFlexMock::Expectation for more details.
|
|
330
334
|
|
331
335
|
* <b>at_least</b>
|
332
336
|
|
333
|
-
Modifies the immediately following message count constraint so that
|
334
|
-
the message is sent at least that number of times. E.g.
|
335
|
-
<tt>at_least.once</tt> means the message is sent at least once
|
336
|
-
test, but may be sent more often. Both <tt>at_least</tt>
|
337
|
-
<tt>at_most</tt> may be specified on the same expectation.
|
337
|
+
Modifies the immediately following message count constraint so that
|
338
|
+
it means the message is sent at least that number of times. E.g.
|
339
|
+
<tt>at_least.once</tt> means the message is sent at least once
|
340
|
+
during the test, but may be sent more often. Both <tt>at_least</tt>
|
341
|
+
and <tt>at_most</tt> may be specified on the same expectation.
|
338
342
|
|
339
343
|
* <b>at_most</b>
|
340
344
|
|
341
|
-
Similar to <tt>at_least</tt>, but puts an upper limit on the number
|
342
|
-
messages. Both <tt>at_least</tt> and <tt>at_most</tt> may be
|
343
|
-
the same expectation.
|
345
|
+
Similar to <tt>at_least</tt>, but puts an upper limit on the number
|
346
|
+
of messages. Both <tt>at_least</tt> and <tt>at_most</tt> may be
|
347
|
+
specified on the same expectation.
|
344
348
|
|
345
349
|
* <b>ordered</b>
|
346
350
|
|
347
|
-
Declares that the expected message is ordered and is expected to be
|
348
|
-
in a certain position in a sequence of messages. The
|
349
|
-
after and previously declared ordered messages
|
350
|
-
declared ordered messages. Unordered
|
351
|
-
the message order.
|
351
|
+
Declares that the expected message is ordered and is expected to be
|
352
|
+
received in a certain position in a sequence of messages. The
|
353
|
+
message should arrive after and previously declared ordered messages
|
354
|
+
and prior to any following declared ordered messages. Unordered
|
355
|
+
messages are ignored when considering the message order.
|
352
356
|
|
353
357
|
Normally ordering is performed only against calls in the same mock
|
354
358
|
object. If the "globally" adjective is used, then ordering is
|
@@ -356,9 +360,10 @@ object. See theFlexMock::Expectation for more details.
|
|
356
360
|
|
357
361
|
* <b>ordered(<em>group</em>)</b>
|
358
362
|
|
359
|
-
Declare that the expected message belongs to an order group. Methods
|
360
|
-
an order group may be received in any order. Ordered messages
|
361
|
-
group must be received either before or after all of the
|
363
|
+
Declare that the expected message belongs to an order group. Methods
|
364
|
+
within an order group may be received in any order. Ordered messages
|
365
|
+
outside the group must be received either before or after all of the
|
366
|
+
grouped messages.
|
362
367
|
|
363
368
|
For example, in the following, messages <code>flip</code> and
|
364
369
|
<code>flop</code> may be received in any order (because they are in
|
@@ -410,17 +415,17 @@ not.
|
|
410
415
|
|
411
416
|
* <b>and_return(<em>value1</em>, <em>value2</em>, ...)</b>
|
412
417
|
|
413
|
-
Declares that the expected message will return a series of values.
|
414
|
-
invocation of the message will return the next value in the
|
415
|
-
value will be repeatably returned if the number of
|
416
|
-
the number of values.
|
418
|
+
Declares that the expected message will return a series of values.
|
419
|
+
Each invocation of the message will return the next value in the
|
420
|
+
series. The last value will be repeatably returned if the number of
|
421
|
+
matching calls exceeds the number of values.
|
417
422
|
|
418
423
|
* <b>and_return { |<em>args</em>, ...| <em>code</em> ... } </b>
|
419
424
|
|
420
|
-
Declares that the expected message will return the yielded value of
|
421
|
-
block. The block will receive all the arguments in the message.
|
422
|
-
message was provided a block, it will be passed as the last
|
423
|
-
block's argument list.
|
425
|
+
Declares that the expected message will return the yielded value of
|
426
|
+
the block. The block will receive all the arguments in the message.
|
427
|
+
If the message was provided a block, it will be passed as the last
|
428
|
+
parameter of the block's argument list.
|
424
429
|
|
425
430
|
* <b>returns( ... )</b>
|
426
431
|
|
@@ -519,10 +524,11 @@ The following rules are used for argument matching:
|
|
519
524
|
with(3) will match f(3)
|
520
525
|
with("hello") will match f("hello")
|
521
526
|
|
522
|
-
* If you wish to override the default matching behavior and force
|
523
|
-
equality, you can use the FlexMock.eq convenience
|
524
|
-
used when you wish to match class objects,
|
525
|
-
behavior for class objects is to match
|
527
|
+
* If you wish to override the default matching behavior and force
|
528
|
+
matching by equality, you can use the FlexMock.eq convenience
|
529
|
+
method. This is mostly used when you wish to match class objects,
|
530
|
+
since the default matching behavior for class objects is to match
|
531
|
+
instances, not themselves.
|
526
532
|
|
527
533
|
Examples:
|
528
534
|
|
@@ -595,9 +601,9 @@ object. If you pass a real object to the <code>flexmock</code> method,
|
|
595
601
|
it will allow you to use that real object in your test and will just
|
596
602
|
mock out the one or two methods that you specify.
|
597
603
|
|
598
|
-
For example, suppose that a Dog object uses a Woofer object to bark.
|
599
|
-
for Dog looks like this (we will leave the code for Woofer to
|
600
|
-
imagination):
|
604
|
+
For example, suppose that a Dog object uses a Woofer object to bark.
|
605
|
+
The code for Dog looks like this (we will leave the code for Woofer to
|
606
|
+
your imagination):
|
601
607
|
|
602
608
|
class Dog
|
603
609
|
def initialize
|
@@ -611,9 +617,9 @@ imagination):
|
|
611
617
|
end
|
612
618
|
end
|
613
619
|
|
614
|
-
Now we want to test Dog, but using a real Woofer object in the test is
|
615
|
-
pain (why? ... well because Woofer plays a sound file of a dog
|
616
|
-
that's really annoying during testing).
|
620
|
+
Now we want to test Dog, but using a real Woofer object in the test is
|
621
|
+
a real pain (why? ... well because Woofer plays a sound file of a dog
|
622
|
+
barking, and that's really annoying during testing).
|
617
623
|
|
618
624
|
So, how can we create a Dog object with mocked Woofer? All we need to
|
619
625
|
do is allow FlexMock to replace the <code>bark</code> method.
|
@@ -636,9 +642,9 @@ Here's the test code:
|
|
636
642
|
end
|
637
643
|
end
|
638
644
|
|
639
|
-
The nice thing about this technique is that after the test is over,
|
640
|
-
out methods are returned to their normal state. Outside the
|
641
|
-
back to normal.
|
645
|
+
The nice thing about this technique is that after the test is over,
|
646
|
+
the mocked out methods are returned to their normal state. Outside the
|
647
|
+
test everything is back to normal.
|
642
648
|
|
643
649
|
<b>NOTE:</b> In previous versions of FlexMock, partial mocking was
|
644
650
|
called "stubs" and the <code>flexstub</code> method was used to create
|
@@ -682,8 +688,8 @@ MiniTest for asserting that mocked methods are actually called.
|
|
682
688
|
section above are allowed in the <code>assert_spy_called</code>
|
683
689
|
method.
|
684
690
|
|
685
|
-
The options
|
686
|
-
default values.
|
691
|
+
The <code>options</code> hash is optional. If omitted, all options
|
692
|
+
will have their default values.
|
687
693
|
|
688
694
|
* <b>assert_spy_not_called <em>mock</em>, <em>options_hash</em>, <em>method_name</em>, <em>args...</em></b>
|
689
695
|
|
data/Rakefile
CHANGED
@@ -78,16 +78,17 @@ end
|
|
78
78
|
|
79
79
|
# RDoc Target --------------------------------------------------------
|
80
80
|
|
81
|
-
task :rdoc => ["html/index.html", :fixcss]
|
81
|
+
task :rdoc => ["README.rdoc", "html/index.html", :fixcss]
|
82
82
|
|
83
83
|
file "html/index.html" => ["Rakefile"] + RDOC_FILES do
|
84
84
|
sh "rdoc -o html --title FlexMock --line-numbers -m README.rdoc #{RDOC_FILES}"
|
85
85
|
end
|
86
86
|
|
87
87
|
file "README.rdoc" => ["Rakefile", "lib/flexmock/version.rb"] do
|
88
|
-
ruby %{-i.bak -pe '$_.sub!(/^Version *:: *(\\d
|
88
|
+
ruby %{-i.bak -pe '$_.sub!(/^Version *:: *((\\d+|beta|rc)\\.)+\\d+ *$/i, "Version :: #{PKG_VERSION}")' README.rdoc} # "
|
89
89
|
end
|
90
90
|
|
91
|
+
desc "Fix the Darkfish CSS so that paragraphs in lists have a bit of spacing"
|
91
92
|
task :fixcss do
|
92
93
|
open("html/rdoc.css") do |ins|
|
93
94
|
open("html/rdoc.new", "w") do |outs|
|
@@ -6,6 +6,8 @@ a few bug fixes.
|
|
6
6
|
|
7
7
|
== Changes in 1.0.0
|
8
8
|
|
9
|
+
=== Features
|
10
|
+
|
9
11
|
* Mocks may now have a base class that limits what methods may be
|
10
12
|
mocked. This allows early detection of outdated mock setups when the
|
11
13
|
methods in the class are refactored.
|
@@ -21,6 +23,12 @@ a few bug fixes.
|
|
21
23
|
* An RSpec matcher (have_received) has been added to make spy
|
22
24
|
assertions easy when using RSpec.
|
23
25
|
|
26
|
+
=== Bug Fixes
|
27
|
+
|
28
|
+
* Now correctly handling the mocking of meta-programmed methods.
|
29
|
+
|
30
|
+
* Using the documented +singleton_methods+ method.
|
31
|
+
|
24
32
|
== What is FlexMock?
|
25
33
|
|
26
34
|
FlexMock is a flexible framework for creating mock object for testing. When
|
@@ -207,7 +207,7 @@ class FlexMock
|
|
207
207
|
# Is the given method name a singleton method in the object we are
|
208
208
|
# mocking?
|
209
209
|
def singleton?(method_name)
|
210
|
-
@obj.
|
210
|
+
@obj.singleton_methods.include?(method_name.to_s)
|
211
211
|
end
|
212
212
|
|
213
213
|
# Hide the existing method definition with a singleton defintion
|
@@ -244,17 +244,24 @@ class FlexMock
|
|
244
244
|
# alias name. If the aliasing process fails (because the method
|
245
245
|
# doesn't really exist, then return nil.
|
246
246
|
def create_alias_for_existing_method(method_name)
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
247
|
+
new_alias = new_name(method_name)
|
248
|
+
unless @obj.respond_to?(new_alias)
|
249
|
+
safe_alias_method(new_alias, method_name)
|
250
|
+
end
|
251
|
+
new_alias
|
252
|
+
end
|
253
|
+
|
254
|
+
# Create an alias for the existing method named +method_name+. It
|
255
|
+
# is possible that +method_name+ is implemented via a
|
256
|
+
# meta-programming, so we provide for the case that the
|
257
|
+
# method_name does not exist.
|
258
|
+
def safe_alias_method(new_alias, method_name)
|
259
|
+
sclass.class_eval do
|
260
|
+
begin
|
261
|
+
alias_method(new_alias, method_name)
|
262
|
+
rescue NameError => ex
|
263
|
+
nil
|
253
264
|
end
|
254
|
-
new_alias
|
255
|
-
rescue NameError => _
|
256
|
-
# Alias attempt failed
|
257
|
-
nil
|
258
265
|
end
|
259
266
|
end
|
260
267
|
|
@@ -283,12 +290,17 @@ class FlexMock
|
|
283
290
|
# Restore the original singleton defintion for method_name that
|
284
291
|
# was saved earlier.
|
285
292
|
def restore_original_definition(method_name)
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
293
|
+
begin
|
294
|
+
method_def = @method_definitions[method_name]
|
295
|
+
if method_def
|
296
|
+
the_alias = new_name(method_name)
|
297
|
+
sclass.class_eval do
|
298
|
+
alias_method(method_name, the_alias)
|
299
|
+
end
|
291
300
|
end
|
301
|
+
rescue NameError => _
|
302
|
+
# Alias attempt failed
|
303
|
+
nil
|
292
304
|
end
|
293
305
|
end
|
294
306
|
|
data/lib/flexmock/version.rb
CHANGED
data/test/partial_mock_test.rb
CHANGED
@@ -269,7 +269,24 @@ class TestStubbing < Test::Unit::TestCase
|
|
269
269
|
assert ! dog.respond_to?(sym), "should not have :#{sym} defined"
|
270
270
|
end
|
271
271
|
end
|
272
|
-
|
272
|
+
|
273
|
+
# This test ensures that singleton? does not use the old methods(false)
|
274
|
+
# call that has fallen out of favor in Ruby 1.9. In multiple 1.9 releases
|
275
|
+
# Delegator#methods will not even accept the optional argument, making flexmock
|
276
|
+
# explode. Since there is a way to get singleton methods officially we might
|
277
|
+
# as well just do it, right?
|
278
|
+
class NoMethods
|
279
|
+
def methods(arg = true)
|
280
|
+
raise "Should not be called in the test lifecycle"
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
def test_object_methods_method_is_not_used_in_singleton_checks
|
285
|
+
obj = NoMethods.new
|
286
|
+
def obj.mock() :original end
|
287
|
+
assert_nothing_raised { flexmock(obj) }
|
288
|
+
end
|
289
|
+
|
273
290
|
def test_partial_mocks_with_mock_method_singleton_colision_have_original_defs_restored
|
274
291
|
dog = Dog.new
|
275
292
|
def dog.mock() :original end
|
@@ -343,6 +360,25 @@ class TestStubbing < Test::Unit::TestCase
|
|
343
360
|
assert_equal :xyzzy, liar.not_defined
|
344
361
|
end
|
345
362
|
|
363
|
+
class MetaDog < Dog
|
364
|
+
def method_missing(method, *args, &block)
|
365
|
+
if method.to_s =~ /meow/
|
366
|
+
:meow
|
367
|
+
else
|
368
|
+
super
|
369
|
+
end
|
370
|
+
end
|
371
|
+
def respond_to_missing?(method, *)
|
372
|
+
method =~ /meow/ || super
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
def test_partial_mock_where_method_created_by_method_missing_and_respond_to_missing
|
377
|
+
dog = MetaDog.new
|
378
|
+
flexmock(dog, :meow => :hiss)
|
379
|
+
assert_equal :hiss, dog.meow
|
380
|
+
end
|
381
|
+
|
346
382
|
# The following test was suggested by Pat Maddox for the RSpec
|
347
383
|
# mocks. Evidently the (poorly implemented) == method caused issues
|
348
384
|
# with RSpec Mock's internals. I'm just double checking for any
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: flexmock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: 6
|
5
|
-
version: 1.0.0.beta.
|
5
|
+
version: 1.0.0.beta.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jim Weirich
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-08-
|
13
|
+
date: 2012-08-22 00:00:00 Z
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: "\n FlexMock is a extremely simple mock object class compatible\n with the Test::Unit framework. Although the FlexMock's\n interface is simple, it is very flexible.\n "
|