flexmock 0.8.3 → 0.8.4
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.
- data/CHANGES +9 -0
- data/README +23 -6
- data/Rakefile +2 -2
- data/TAGS +89 -69
- data/doc/releases/flexmock-0.8.3.rdoc +94 -0
- data/doc/releases/flexmock-0.8.4.rdoc +93 -0
- data/lib/flexmock/argument_matchers.rb +29 -0
- data/lib/flexmock/argument_types.rb +12 -0
- data/lib/flexmock/mock_container.rb +14 -9
- data/lib/flexmock/rails/view_mocking.rb +23 -2
- data/test/test_should_receive.rb +40 -0
- metadata +8 -4
data/CHANGES
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
= Changes for FlexMock
|
2
2
|
|
3
|
+
== Version 0.8.4
|
4
|
+
|
5
|
+
* Added support for rails 2.2.x in should_render_view.
|
6
|
+
|
7
|
+
== Version 0.8.3
|
8
|
+
|
9
|
+
* Fixed a bug where the by_default option was not completely honored
|
10
|
+
in some edge cases.
|
11
|
+
|
3
12
|
== Version 0.8.2
|
4
13
|
|
5
14
|
* Added workaround for compatibility issues with RSpec on Rails.
|
data/README
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
FlexMock is a simple, but flexible, mock object library for Ruby unit
|
4
4
|
testing.
|
5
5
|
|
6
|
-
Version :: 0.8.
|
6
|
+
Version :: 0.8.4
|
7
7
|
|
8
8
|
= Links
|
9
9
|
|
@@ -470,12 +470,29 @@ The following rules are used for argument matching:
|
|
470
470
|
with(eq(Integer)) will match f(Integer)
|
471
471
|
with(eq(Integer)) will NOT match f(3)
|
472
472
|
|
473
|
-
Note
|
474
|
-
module, or the FlexMock::ArgumentTypes module, you will
|
475
|
-
fully qualify the +eq+ method
|
473
|
+
<b>Note:</b> If you do not use the FlexMock::TestCase Test Unit
|
474
|
+
integration module, or the FlexMock::ArgumentTypes module, you will
|
475
|
+
have to fully qualify the +eq+ method. This is true of all the
|
476
|
+
special argument matches (+eq+, +on+, +any+, +hsh+ and +ducktype+).
|
476
477
|
|
477
|
-
with(FlexMock.eq(Integer))
|
478
|
-
with(FlexMock.
|
478
|
+
with(FlexMock.eq(Integer))
|
479
|
+
with(FlexMock.on { code })
|
480
|
+
with(FlexMock.any)
|
481
|
+
with(FlexMock.hsh(:tag => 3))
|
482
|
+
with(FlexMock.ducktype(:wag => "dog"))
|
483
|
+
|
484
|
+
* If you wish to match a hash on _some_ of its values, the
|
485
|
+
FlexMock.hsh(...) method will work. Only specify the hash values
|
486
|
+
you are interested in, the others will be ignored.
|
487
|
+
|
488
|
+
with(hsh(:run => true)) will match f(:run => true, :stop => false)
|
489
|
+
|
490
|
+
* If you wish to match any object that responds to a certain set of
|
491
|
+
methods, use the FlexMock.ducktype method.
|
492
|
+
|
493
|
+
with(ducktype(:to_str)) will match f("string")
|
494
|
+
with(ducktype(:wag, :bark)) will match f(dog)
|
495
|
+
(assuming dog implements wag and bark)
|
479
496
|
|
480
497
|
* If you wish to match _anything_, then use the <tt>FlexMock.any</tt>
|
481
498
|
method in the with argument list.
|
data/Rakefile
CHANGED
@@ -19,7 +19,7 @@ require 'rake/contrib/rubyforgepublisher'
|
|
19
19
|
CLEAN.include('*.tmp')
|
20
20
|
CLOBBER.include("html", 'pkg')
|
21
21
|
|
22
|
-
PKG_VERSION = '0.8.
|
22
|
+
PKG_VERSION = '0.8.4'
|
23
23
|
|
24
24
|
PKG_FILES = FileList[
|
25
25
|
'[A-Z]*',
|
@@ -145,7 +145,7 @@ else
|
|
145
145
|
|
146
146
|
s.author = "Jim Weirich"
|
147
147
|
s.email = "jim@weirichhouse.org"
|
148
|
-
s.homepage = "http://
|
148
|
+
s.homepage = "http://flexmock.rubyforge.org"
|
149
149
|
end
|
150
150
|
|
151
151
|
Rake::GemPackageTask.new(spec) do |pkg|
|
data/TAGS
CHANGED
@@ -60,14 +60,13 @@ class FlexMockFlexMock15,371
|
|
60
60
|
def initializeinitialize75,2276
|
61
61
|
def passed?passed?79,2337
|
62
62
|
|
63
|
-
lib/flexmock/default_framework_adapter.rb,
|
63
|
+
lib/flexmock/default_framework_adapter.rb,345
|
64
64
|
class FlexMockFlexMock14,337
|
65
65
|
class DefaultFrameworkAdapterDefaultFrameworkAdapter15,352
|
66
66
|
def assert_block(msg, &block)assert_block16,384
|
67
67
|
def assert_equal(a, b, msg=nil)assert_equal22,497
|
68
|
-
|
69
|
-
|
70
|
-
def assertion_failed_errorassertion_failed_error31,709
|
68
|
+
class AssertionFailedError < StandardError; endAssertionFailedError26,597
|
69
|
+
def assertion_failed_errorassertion_failed_error27,649
|
71
70
|
|
72
71
|
lib/flexmock/deprecated_methods.rb,340
|
73
72
|
class ModuleModule13,314
|
@@ -137,38 +136,26 @@ class FlexMockFlexMock15,363
|
|
137
136
|
def call(*args)call38,1207
|
138
137
|
def <<(expectation)<<46,1460
|
139
138
|
def find_expectation(*args) # :nodoc:find_expectation51,1584
|
140
|
-
def flexmock_verify # :nodoc:flexmock_verify
|
141
|
-
def defaultify_expectation(exp) # :nodoc:defaultify_expectation
|
142
|
-
def find_expectation_in(expectations, *args)find_expectation_in
|
143
|
-
|
144
|
-
lib/flexmock/mini_unit.rb,393
|
145
|
-
class FlexMockFlexMock15,357
|
146
|
-
module TestCaseTestCase29,918
|
147
|
-
def teardownteardown35,1093
|
148
|
-
class MiniUnitFrameworkAdapterMiniUnitFrameworkAdapter45,1302
|
149
|
-
def assertion_failed_errorassertion_failed_error47,1364
|
150
|
-
def passed?(test_case)passed?51,1426
|
151
|
-
module MiniMini59,1536
|
152
|
-
class TestTest60,1548
|
153
|
-
class TestCaseTestCase61,1561
|
154
|
-
def teardownteardown70,1876
|
139
|
+
def flexmock_verify # :nodoc:flexmock_verify62,1959
|
140
|
+
def defaultify_expectation(exp) # :nodoc:defaultify_expectation69,2170
|
141
|
+
def find_expectation_in(expectations, *args)find_expectation_in81,2451
|
155
142
|
|
156
143
|
lib/flexmock/mock_container.rb,882
|
157
|
-
class FlexMockFlexMock
|
158
|
-
module MockContainerMockContainer
|
159
|
-
def flexmock_teardownflexmock_teardown
|
160
|
-
def flexmock_verifyflexmock_verify
|
161
|
-
def flexmock_closeflexmock_close
|
162
|
-
def flexmock(*args)flexmock
|
163
|
-
def flexmock_remember(mocking_object)flexmock_remember
|
164
|
-
class MockContainerHelperMockContainerHelper
|
165
|
-
def next_idnext_id
|
166
|
-
def parse_should_args(mock, args, &block) # :nodoc:parse_should_args
|
167
|
-
def add_model_methods(mock, model_class, id)add_model_methods
|
168
|
-
def make_partial_proxy(container, obj, name, safe_mode)make_partial_proxy
|
169
|
-
def build_demeter_chain(mock, arg, &block)build_demeter_chain
|
170
|
-
def check_proper_mock(mock, method_name)check_proper_mock
|
171
|
-
def check_method_names(names)check_method_names
|
144
|
+
class FlexMockFlexMock16,399
|
145
|
+
module MockContainerMockContainer26,805
|
146
|
+
def flexmock_teardownflexmock_teardown31,989
|
147
|
+
def flexmock_verifyflexmock_verify38,1147
|
148
|
+
def flexmock_closeflexmock_close47,1442
|
149
|
+
def flexmock(*args)flexmock116,4712
|
150
|
+
def flexmock_remember(mocking_object)flexmock_remember158,5988
|
151
|
+
class MockContainerHelperMockContainerHelper174,6638
|
152
|
+
def next_idnext_id178,6747
|
153
|
+
def parse_should_args(mock, args, &block) # :nodoc:parse_should_args191,7220
|
154
|
+
def add_model_methods(mock, model_class, id)add_model_methods209,7733
|
155
|
+
def make_partial_proxy(container, obj, name, safe_mode)make_partial_proxy233,8592
|
156
|
+
def build_demeter_chain(mock, arg, &block)build_demeter_chain278,10445
|
157
|
+
def check_proper_mock(mock, method_name)check_proper_mock303,11296
|
158
|
+
def check_method_names(names)check_method_names313,11703
|
172
159
|
|
173
160
|
lib/flexmock/noop.rb,0
|
174
161
|
|
@@ -225,6 +212,30 @@ class FlexMockFlexMock14,347
|
|
225
212
|
def strict?strict?53,1675
|
226
213
|
def method_missing(sym, *args, &block)method_missing59,1805
|
227
214
|
|
215
|
+
lib/flexmock/rmock.rb,991
|
216
|
+
class ObjectObject4,59
|
217
|
+
def stub!(method)stub!5,72
|
218
|
+
def should_receive(method)should_receive8,157
|
219
|
+
class FlexMockFlexMock13,261
|
220
|
+
class GlobalContainerGlobalContainer14,276
|
221
|
+
module RMockEmulationRMockEmulation20,375
|
222
|
+
class SpecialArgSpecialArg23,436
|
223
|
+
def initialize(&block)initialize24,457
|
224
|
+
def apply(exp)apply27,519
|
225
|
+
class RMockExpecationProxyRMockExpecationProxy35,682
|
226
|
+
def initialize(expectation)initialize36,713
|
227
|
+
def with(*args)with39,792
|
228
|
+
def method_missing(sym, *args, &block)method_missing48,1053
|
229
|
+
class RMockProxyRMockProxy53,1163
|
230
|
+
def initialize(mock)initialize54,1184
|
231
|
+
def should_receive(method)should_receive57,1242
|
232
|
+
def should_not_receive(method)should_not_receive60,1353
|
233
|
+
def method_missing(sym, *args, &block)method_missing63,1469
|
234
|
+
def mock(name, options={})mock68,1598
|
235
|
+
def stub(name, options={})stub74,1742
|
236
|
+
def no_argsno_args78,1812
|
237
|
+
def any_argsany_args82,1851
|
238
|
+
|
228
239
|
lib/flexmock/rspec.rb,341
|
229
240
|
class FlexMockFlexMock14,337
|
230
241
|
class RSpecFrameworkAdapterRSpecFrameworkAdapter16,355
|
@@ -239,13 +250,12 @@ module TestTest14,354
|
|
239
250
|
class TestCaseTestCase16,380
|
240
251
|
def teardownteardown25,695
|
241
252
|
|
242
|
-
lib/flexmock/test_unit_integration.rb,
|
253
|
+
lib/flexmock/test_unit_integration.rb,227
|
243
254
|
class FlexMockFlexMock15,357
|
244
255
|
module TestCaseTestCase29,917
|
245
256
|
def teardownteardown35,1092
|
246
257
|
class TestUnitFrameworkAdapterTestUnitFrameworkAdapter45,1301
|
247
258
|
def assertion_failed_errorassertion_failed_error47,1369
|
248
|
-
def passed?(test_case)passed?51,1448
|
249
259
|
|
250
260
|
lib/flexmock/undefined.rb,288
|
251
261
|
class FlexMockFlexMock12,312
|
@@ -277,29 +287,13 @@ class FlexMockFlexMock12,312
|
|
277
287
|
module FailureAssertionFailureAssertion15,368
|
278
288
|
def assert_failure(message=nil)assert_failure21,567
|
279
289
|
|
280
|
-
test/frameworks/mini_unit_test.rb,407
|
281
|
-
class FlexmockMiniUnitTest < Mini::Test::TestCaseFlexmockMiniUnitTest20,432
|
282
|
-
def test_can_create_mockstest_can_create_mocks22,509
|
283
|
-
def test_can_use_argument_matcherstest_can_use_argument_matchers28,609
|
284
|
-
class FlexmockMinitUnitCleanupTest < Mini::Test::TestCaseFlexmockMinitUnitCleanupTest35,730
|
285
|
-
def teardownteardown37,789
|
286
|
-
def test_mocks_are_auto_verifiedtest_mocks_are_auto_verified50,1066
|
287
|
-
|
288
|
-
test/frameworks/rspec_spec.rb,0
|
289
|
-
|
290
|
-
test/frameworks/test_unit_test.rb,431
|
291
|
-
class TestFlexmockTestUnit < Test::Unit::TestCaseTestFlexmockTestUnit18,412
|
292
|
-
def test_can_create_mockstest_can_create_mocks20,489
|
293
|
-
def test_can_use_argument_matcherstest_can_use_argument_matchers26,589
|
294
|
-
class TestFlexmockTestUnitCleanup < Test::Unit::TestCaseTestFlexmockTestUnitCleanup33,710
|
295
|
-
def teardownteardown35,768
|
296
|
-
def test_should_fail__mocks_are_auto_verifiedtest_should_fail__mocks_are_auto_verified45,1004
|
297
|
-
|
298
290
|
test/redirect_error.rb,114
|
299
291
|
class FlexMockFlexMock3,20
|
300
292
|
module RedirectErrorRedirectError4,35
|
301
293
|
def redirect_errorredirect_error5,58
|
302
294
|
|
295
|
+
test/rspec_integration/integration_spec.rb,0
|
296
|
+
|
303
297
|
test/test_aliasing.rb,522
|
304
298
|
class FlexMockFlexMock6,61
|
305
299
|
module StubsAndExpectsStubsAndExpects7,76
|
@@ -577,6 +571,26 @@ class TestRecordMode < Test::Unit::TestCaseTestRecordMode16,390
|
|
577
571
|
def test_strict_record_mode_requires_oncetest_strict_record_mode_requires_once136,3242
|
578
572
|
def test_strict_record_mode_can_not_failtest_strict_record_mode_can_not_fail149,3517
|
579
573
|
|
574
|
+
test/test_rmock.rb,1390
|
575
|
+
class RMockTest < Test::Unit::TestCaseRMockTest6,94
|
576
|
+
def test_can_mock_methodstest_can_mock_methods9,169
|
577
|
+
def test_mocks_require_their_methods_to_be_called_at_least_oncetest_mocks_require_their_methods_to_be_called_at_least_once15,262
|
578
|
+
def test_undefined_methods_failtest_undefined_methods_fail23,470
|
579
|
+
def test_null_object_optiontest_null_object_option30,597
|
580
|
+
def test_can_create_stubstest_can_create_stubs36,753
|
581
|
+
def test_stubs_dont_care_if_their_methods_arent_calledtest_stubs_dont_care_if_their_methods_arent_called41,928
|
582
|
+
def test_stubbing_partial_mockstest_stubbing_partial_mocks45,1024
|
583
|
+
def test_mocking_partial_mockstest_mocking_partial_mocks51,1152
|
584
|
+
def test_mocking_partial_mockstest_mocking_partial_mocks57,1288
|
585
|
+
def test_should_not_receive_where_it_is_not_receivedtest_should_not_receive_where_it_is_not_received65,1487
|
586
|
+
def test_should_not_receive_where_it_is_receivedtest_should_not_receive_where_it_is_received70,1604
|
587
|
+
def test_with_matching_argstest_with_matching_args79,1814
|
588
|
+
def test_with_mismatching_argstest_with_mismatching_args85,1918
|
589
|
+
def test_with_no_args_matchingtest_with_no_args_matching95,2130
|
590
|
+
def test_with_no_args_mismatchingtest_with_no_args_mismatching101,2240
|
591
|
+
def test_with_any_args_and_no_argstest_with_any_args_and_no_args109,2420
|
592
|
+
def test_with_any_args_and_1_argtest_with_any_args_and_1_arg115,2535
|
593
|
+
|
580
594
|
test/test_samples.rb,2164
|
581
595
|
class TestSamples < Test::Unit::TestCaseTestSamples17,378
|
582
596
|
def test_file_iotest_file_io25,748
|
@@ -636,7 +650,7 @@ class TestShouldIgnoreMissing < Test::Unit::TestCaseTestShouldIgnoreMissing16,
|
|
636
650
|
def test_not_calling_method_proc_will_fail_count_constraintstest_not_calling_method_proc_will_fail_count_constraints66,1693
|
637
651
|
def test_method_returns_do_nothing_proc_for_missing_methodstest_method_returns_do_nothing_proc_for_missing_methods75,1965
|
638
652
|
|
639
|
-
test/test_should_receive.rb,
|
653
|
+
test/test_should_receive.rb,10636
|
640
654
|
def mock_top_level_functionmock_top_level_function16,375
|
641
655
|
module KernelKernel20,416
|
642
656
|
def mock_kernel_functionmock_kernel_function21,430
|
@@ -735,20 +749,20 @@ class TestFlexMockShoulds < Test::Unit::TestCaseTestFlexMockShoulds26,477
|
|
735
749
|
def test_expectations_with_count_constraints_can_by_marked_as_defaulttest_expectations_with_count_constraints_can_by_marked_as_default902,23069
|
736
750
|
def test_default_expectations_are_overridden_by_later_expectationstest_default_expectations_are_overridden_by_later_expectations910,23315
|
737
751
|
def test_default_expectations_can_be_changed_by_later_expectationstest_default_expectations_can_be_changed_by_later_expectations918,23543
|
738
|
-
def test_ordered_default_expectations_can_be_specifiedtest_ordered_default_expectations_can_be_specified
|
739
|
-
def test_ordered_default_expectations_can_be_overriddentest_ordered_default_expectations_can_be_overridden
|
740
|
-
def test_by_default_works_at_mock_leveltest_by_default_works_at_mock_level
|
741
|
-
def test_by_default_at_mock_level_does_nothing_with_no_expectationstest_by_default_at_mock_level_does_nothing_with_no_expectations
|
742
|
-
def test_partial_mocks_can_have_default_expectationstest_partial_mocks_can_have_default_expectations
|
743
|
-
def test_partial_mocks_can_have_default_expectations_overriddentest_partial_mocks_can_have_default_expectations_overridden
|
744
|
-
def test_wicked_and_evil_tricks_with_by_default_are_thwartedtest_wicked_and_evil_tricks_with_by_default_are_thwarted
|
745
|
-
def test_mocks_can_handle_multi_parameter_respond_tostest_mocks_can_handle_multi_parameter_respond_tos
|
746
|
-
def test_can_mock_operatorstest_can_mock_operators
|
747
|
-
def assert_operator(op, &block)assert_operator
|
748
|
-
class TestFlexMockShouldsWithInclude < Test::Unit::TestCaseTestFlexMockShouldsWithInclude
|
749
|
-
def test_include_enables_unqualified_arg_type_referencestest_include_enables_unqualified_arg_type_references
|
750
|
-
class TestFlexMockArgTypesDontLeak < Test::Unit::TestCaseTestFlexMockArgTypesDontLeak
|
751
|
-
def test_unqualified_arg_type_references_are_undefined_by_defaulttest_unqualified_arg_type_references_are_undefined_by_default
|
752
|
+
def test_ordered_default_expectations_can_be_specifiedtest_ordered_default_expectations_can_be_specified929,23915
|
753
|
+
def test_ordered_default_expectations_can_be_overriddentest_ordered_default_expectations_can_be_overridden937,24166
|
754
|
+
def test_by_default_works_at_mock_leveltest_by_default_works_at_mock_level949,24437
|
755
|
+
def test_by_default_at_mock_level_does_nothing_with_no_expectationstest_by_default_at_mock_level_does_nothing_with_no_expectations960,24712
|
756
|
+
def test_partial_mocks_can_have_default_expectationstest_partial_mocks_can_have_default_expectations966,24857
|
757
|
+
def test_partial_mocks_can_have_default_expectations_overriddentest_partial_mocks_can_have_default_expectations_overridden972,25038
|
758
|
+
def test_wicked_and_evil_tricks_with_by_default_are_thwartedtest_wicked_and_evil_tricks_with_by_default_are_thwarted979,25286
|
759
|
+
def test_mocks_can_handle_multi_parameter_respond_tostest_mocks_can_handle_multi_parameter_respond_tos991,25691
|
760
|
+
def test_can_mock_operatorstest_can_mock_operators1002,26038
|
761
|
+
def assert_operator(op, &block)assert_operator1031,27053
|
762
|
+
class TestFlexMockShouldsWithInclude < Test::Unit::TestCaseTestFlexMockShouldsWithInclude1039,27207
|
763
|
+
def test_include_enables_unqualified_arg_type_referencestest_include_enables_unqualified_arg_type_references1041,27301
|
764
|
+
class TestFlexMockArgTypesDontLeak < Test::Unit::TestCaseTestFlexMockArgTypesDontLeak1049,27465
|
765
|
+
def test_unqualified_arg_type_references_are_undefined_by_defaulttest_unqualified_arg_type_references_are_undefined_by_default1050,27523
|
752
766
|
|
753
767
|
test/test_tu_integration.rb,1570
|
754
768
|
class TestTuIntegrationFlexMockMethod < Test::Unit::TestCaseTestTuIntegrationFlexMockMethod15,352
|
@@ -784,3 +798,9 @@ class UndefinedTest < Test::Unit::TestCaseUndefinedTest15,352
|
|
784
798
|
def test_undefined_is_not_niltest_undefined_is_not_nil75,1934
|
785
799
|
def assert_undefined(obj)assert_undefined81,2012
|
786
800
|
def undefinedundefined85,2075
|
801
|
+
|
802
|
+
test/test_unit_integration/test_auto_test_unit.rb,263
|
803
|
+
class TestFlexmockTestUnit < Test::Unit::TestCaseTestFlexmockTestUnit17,387
|
804
|
+
def teardownteardown18,437
|
805
|
+
def test_can_create_mockstest_can_create_mocks23,496
|
806
|
+
def test_should_fail__mocks_are_auto_verifiedtest_should_fail__mocks_are_auto_verified30,641
|
@@ -0,0 +1,94 @@
|
|
1
|
+
= FlexMock 0.8.3 Released
|
2
|
+
|
3
|
+
FlexMock is a flexible mocking library for use in unit testing and
|
4
|
+
behavior specification in Ruby. Release 0.8.3 is a minor release with
|
5
|
+
a few bug fixes.
|
6
|
+
|
7
|
+
== Bug Fixes in 0.8.3
|
8
|
+
|
9
|
+
* Fixed a bug where the by_default option was not completely honored
|
10
|
+
in some edge cases.
|
11
|
+
|
12
|
+
== What is FlexMock?
|
13
|
+
|
14
|
+
FlexMock is a flexible framework for creating mock object for testing. When
|
15
|
+
running unit tests, it is often desirable to use isolate the objects being
|
16
|
+
tested from the "real world" by having them interact with simplified test
|
17
|
+
objects. Sometimes these test objects simply return values when called, other
|
18
|
+
times they verify that certain methods were called with particular arguments
|
19
|
+
in a particular order.
|
20
|
+
|
21
|
+
FlexMock makes creating these test objects easy.
|
22
|
+
|
23
|
+
=== Features
|
24
|
+
|
25
|
+
* Easy integration with both Test::Unit and RSpec. Mocks created with the
|
26
|
+
flexmock method are automatically verified at the end of the test or
|
27
|
+
example.
|
28
|
+
|
29
|
+
* A fluent interface that allows mock behavior to be specified very
|
30
|
+
easily.
|
31
|
+
|
32
|
+
* A "record mode" where an existing implementation can record its
|
33
|
+
interaction with a mock for later validation against a new
|
34
|
+
implementation.
|
35
|
+
|
36
|
+
* Easy mocking of individual methods in existing, non-mock objects.
|
37
|
+
|
38
|
+
* Easy mocking of chains of method calls.
|
39
|
+
|
40
|
+
* The ability to cause classes to instantiate test instances (instead of real
|
41
|
+
instances) for the duration of a test.
|
42
|
+
|
43
|
+
=== Example
|
44
|
+
|
45
|
+
Suppose you had a Dog object that wagged a tail when it was happy.
|
46
|
+
Something like this:
|
47
|
+
|
48
|
+
class Dog
|
49
|
+
def initialize(a_tail)
|
50
|
+
@tail = a_tail
|
51
|
+
end
|
52
|
+
def happy
|
53
|
+
@tail.wag
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
To test the +Dog+ class without a real +Tail+ object (perhaps because
|
58
|
+
real +Tail+ objects activate servos in some robotic equipment), you
|
59
|
+
can do something like this:
|
60
|
+
|
61
|
+
require 'test/unit'
|
62
|
+
require 'flexmock/test_unit'
|
63
|
+
|
64
|
+
class TestDog < Test::Unit::TestCase
|
65
|
+
def test_dog_wags_tail_when_happy
|
66
|
+
tail = flexmock("tail")
|
67
|
+
tail.should_receive(:wag).once
|
68
|
+
dog = Dog.new(tail)
|
69
|
+
dog.happy
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
FlexMock will automatically verify that the mocked tail object received the
|
74
|
+
message +wag+ exactly one time. If it doesn't, the test will not pass.
|
75
|
+
|
76
|
+
See the FlexMock documentation at http://flexmock.rubyforge.org for details on
|
77
|
+
specifying arguments and return values on mocked methods, as well as a simple
|
78
|
+
technique for mocking tail objects when the Dog class creates the tail objects
|
79
|
+
directly.
|
80
|
+
|
81
|
+
== Availability
|
82
|
+
|
83
|
+
You can make sure you have the latest version with a quick RubyGems command:
|
84
|
+
|
85
|
+
gem install flexmock (you may need root/admin privileges)
|
86
|
+
|
87
|
+
Otherwise, you can get it from the more traditional places:
|
88
|
+
|
89
|
+
Download:: http://rubyforge.org/project/showfiles.php?group_id=170
|
90
|
+
|
91
|
+
You will find documentation at: http://flexmock.rubyforge.org.
|
92
|
+
|
93
|
+
-- Jim Weirich
|
94
|
+
|
@@ -0,0 +1,93 @@
|
|
1
|
+
= FlexMock 0.8.4 Released
|
2
|
+
|
3
|
+
FlexMock is a flexible mocking library for use in unit testing and
|
4
|
+
behavior specification in Ruby. Release 0.8.4 is a minor release with
|
5
|
+
a few bug fixes.
|
6
|
+
|
7
|
+
== Bug Fixes in 0.8.4
|
8
|
+
|
9
|
+
* The should_render_view method is now compatible with Rails 2.2.2.
|
10
|
+
|
11
|
+
== What is FlexMock?
|
12
|
+
|
13
|
+
FlexMock is a flexible framework for creating mock object for testing. When
|
14
|
+
running unit tests, it is often desirable to use isolate the objects being
|
15
|
+
tested from the "real world" by having them interact with simplified test
|
16
|
+
objects. Sometimes these test objects simply return values when called, other
|
17
|
+
times they verify that certain methods were called with particular arguments
|
18
|
+
in a particular order.
|
19
|
+
|
20
|
+
FlexMock makes creating these test objects easy.
|
21
|
+
|
22
|
+
=== Features
|
23
|
+
|
24
|
+
* Easy integration with both Test::Unit and RSpec. Mocks created with the
|
25
|
+
flexmock method are automatically verified at the end of the test or
|
26
|
+
example.
|
27
|
+
|
28
|
+
* A fluent interface that allows mock behavior to be specified very
|
29
|
+
easily.
|
30
|
+
|
31
|
+
* A "record mode" where an existing implementation can record its
|
32
|
+
interaction with a mock for later validation against a new
|
33
|
+
implementation.
|
34
|
+
|
35
|
+
* Easy mocking of individual methods in existing, non-mock objects.
|
36
|
+
|
37
|
+
* Easy mocking of chains of method calls.
|
38
|
+
|
39
|
+
* The ability to cause classes to instantiate test instances (instead of real
|
40
|
+
instances) for the duration of a test.
|
41
|
+
|
42
|
+
=== Example
|
43
|
+
|
44
|
+
Suppose you had a Dog object that wagged a tail when it was happy.
|
45
|
+
Something like this:
|
46
|
+
|
47
|
+
class Dog
|
48
|
+
def initialize(a_tail)
|
49
|
+
@tail = a_tail
|
50
|
+
end
|
51
|
+
def happy
|
52
|
+
@tail.wag
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
To test the +Dog+ class without a real +Tail+ object (perhaps because
|
57
|
+
real +Tail+ objects activate servos in some robotic equipment), you
|
58
|
+
can do something like this:
|
59
|
+
|
60
|
+
require 'test/unit'
|
61
|
+
require 'flexmock/test_unit'
|
62
|
+
|
63
|
+
class TestDog < Test::Unit::TestCase
|
64
|
+
def test_dog_wags_tail_when_happy
|
65
|
+
tail = flexmock("tail")
|
66
|
+
tail.should_receive(:wag).once
|
67
|
+
dog = Dog.new(tail)
|
68
|
+
dog.happy
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
FlexMock will automatically verify that the mocked tail object received the
|
73
|
+
message +wag+ exactly one time. If it doesn't, the test will not pass.
|
74
|
+
|
75
|
+
See the FlexMock documentation at http://flexmock.rubyforge.org for details on
|
76
|
+
specifying arguments and return values on mocked methods, as well as a simple
|
77
|
+
technique for mocking tail objects when the Dog class creates the tail objects
|
78
|
+
directly.
|
79
|
+
|
80
|
+
== Availability
|
81
|
+
|
82
|
+
You can make sure you have the latest version with a quick RubyGems command:
|
83
|
+
|
84
|
+
gem install flexmock (you may need root/admin privileges)
|
85
|
+
|
86
|
+
Otherwise, you can get it from the more traditional places:
|
87
|
+
|
88
|
+
Download:: http://rubyforge.org/project/showfiles.php?group_id=170
|
89
|
+
|
90
|
+
You will find documentation at: http://flexmock.rubyforge.org.
|
91
|
+
|
92
|
+
-- Jim Weirich
|
93
|
+
|
@@ -53,5 +53,34 @@ class FlexMock
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
+
####################################################################
|
57
|
+
# Match only things where the block evaluates to true.
|
58
|
+
class HashMatcher
|
59
|
+
def initialize(hash)
|
60
|
+
@hash = hash
|
61
|
+
end
|
62
|
+
def ===(target)
|
63
|
+
@hash.all? { |k, v| target[k] == v }
|
64
|
+
end
|
65
|
+
def inspect
|
66
|
+
"hsh(#{@hash.inspect})"
|
67
|
+
"hsh(...)"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
####################################################################
|
72
|
+
# Match only things where the block evaluates to true.
|
73
|
+
class DuckMatcher
|
74
|
+
def initialize(methods)
|
75
|
+
@methods = methods
|
76
|
+
end
|
77
|
+
def ===(target)
|
78
|
+
@methods.all? { |m| target.respond_to?(m) }
|
79
|
+
end
|
80
|
+
def inspect
|
81
|
+
"ducktype(#{@methods.map{|m| m.inspect}.join(',')})"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
56
85
|
|
57
86
|
end
|
@@ -36,6 +36,18 @@ class FlexMock
|
|
36
36
|
def on(&block)
|
37
37
|
ProcMatcher.new(&block)
|
38
38
|
end
|
39
|
+
|
40
|
+
# Return an argument matcher that matches a hash with the given
|
41
|
+
# entries.
|
42
|
+
def hsh(hash)
|
43
|
+
HashMatcher.new(hash)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Return an argument matcher that matches any object that
|
47
|
+
# implementes (i.e. responds to) the given method list.
|
48
|
+
def ducktype(*methods)
|
49
|
+
DuckMatcher.new(methods)
|
50
|
+
end
|
39
51
|
end
|
40
52
|
extend ArgumentTypes
|
41
53
|
|
@@ -11,6 +11,7 @@
|
|
11
11
|
|
12
12
|
require 'flexmock/noop'
|
13
13
|
require 'flexmock/argument_types'
|
14
|
+
require 'flexmock/ordering'
|
14
15
|
|
15
16
|
class FlexMock
|
16
17
|
|
@@ -207,24 +208,28 @@ class FlexMock
|
|
207
208
|
# models.
|
208
209
|
def add_model_methods(mock, model_class, id)
|
209
210
|
container = mock.flexmock_container
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
211
|
+
|
212
|
+
mock_errors = container.flexmock("errors")
|
213
|
+
mock_errors.should_receive(:count).and_return(0).by_default
|
214
|
+
|
215
|
+
mock.should_receive(:id).and_return(id).by_default
|
216
|
+
mock.should_receive(:to_params).and_return(id.to_s).by_default
|
217
|
+
mock.should_receive(:new_record?).and_return(false).by_default
|
218
|
+
mock.should_receive(:class).and_return(model_class).by_default
|
219
|
+
mock.should_receive(:errors).and_return(mock_errors).by_default
|
220
|
+
|
216
221
|
# HACK: Ruby 1.9 needs the following lambda so that model_class
|
217
222
|
# is correctly bound below.
|
218
223
|
lambda { }
|
219
224
|
mock.should_receive(:is_a?).with(any).and_return { |other|
|
220
225
|
other == model_class
|
221
|
-
}
|
226
|
+
}.by_default
|
222
227
|
mock.should_receive(:instance_of?).with(any).and_return { |other|
|
223
228
|
other == model_class
|
224
|
-
}
|
229
|
+
}.by_default
|
225
230
|
mock.should_receive(:kind_of?).with(any).and_return { |other|
|
226
231
|
model_class.ancestors.include?(other)
|
227
|
-
}
|
232
|
+
}.by_default
|
228
233
|
end
|
229
234
|
|
230
235
|
# Create a PartialMockProxy for the given object. Use +name+ as
|
@@ -27,8 +27,10 @@ class FlexMock
|
|
27
27
|
should_render_view_prior_version_124(template_name)
|
28
28
|
elsif rails_version <= '2.0.0'
|
29
29
|
should_render_view_after_version_124(template_name)
|
30
|
-
|
30
|
+
elsif rails_version < '2.2'
|
31
31
|
should_render_view_after_version_202(template_name)
|
32
|
+
else
|
33
|
+
should_render_view_22x(template_name)
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
@@ -97,6 +99,25 @@ class FlexMock
|
|
97
99
|
end
|
98
100
|
flexmock(ActionView::Base).should_receive(:new).and_return(viewmock)
|
99
101
|
end
|
100
|
-
|
102
|
+
|
103
|
+
# This version of should_render_view will work with versions of
|
104
|
+
# Rails at Version 2.2.x.
|
105
|
+
def should_render_view_22x(template_name)
|
106
|
+
viewmock = flexmock("ViewMock")
|
107
|
+
viewmock.should_receive(
|
108
|
+
:helpers => viewmock,
|
109
|
+
:include => nil,
|
110
|
+
:template_format =>nil,
|
111
|
+
:render => "RENDERED TEXT",
|
112
|
+
:assigns => {})
|
113
|
+
if template_name
|
114
|
+
viewmock.should_receive(:_exempt_from_layout?).with(/\/#{template_name}$/).
|
115
|
+
and_return(true).once
|
116
|
+
viewmock.should_receive(:_exempt_from_layout?).and_return(true)
|
117
|
+
else
|
118
|
+
viewmock.should_receive(:_exempt_from_layout?).at_least.once.and_return(true)
|
119
|
+
end
|
120
|
+
flexmock(ActionView::Base).should_receive(:new).and_return(viewmock)
|
121
|
+
end
|
101
122
|
end
|
102
123
|
end
|
data/test/test_should_receive.rb
CHANGED
@@ -23,6 +23,14 @@ module Kernel
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
# Used for testing
|
27
|
+
class Cat
|
28
|
+
def purr
|
29
|
+
end
|
30
|
+
def meow
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
26
34
|
class TestFlexMockShoulds < Test::Unit::TestCase
|
27
35
|
include FlexMock::TestCase
|
28
36
|
include FlexMock::FailureAssertion
|
@@ -357,6 +365,38 @@ class TestFlexMockShoulds < Test::Unit::TestCase
|
|
357
365
|
end
|
358
366
|
end
|
359
367
|
|
368
|
+
def test_with_ducktype_arg_matching
|
369
|
+
FlexMock.use('greeter') do |m|
|
370
|
+
m.should_receive(:hi).with(FlexMock.ducktype(:purr, :meow)).once
|
371
|
+
m.hi(Cat.new)
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
def test_with_ducktype_arg_matching_no_match
|
376
|
+
FlexMock.use('greeter') do |m|
|
377
|
+
m.should_receive(:hi).with(FlexMock.ducktype(:purr, :meow, :growl))
|
378
|
+
assert_failure {
|
379
|
+
m.hi(Cat.new)
|
380
|
+
}
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
def test_with_hash_matching
|
385
|
+
FlexMock.use('greeter') do |m|
|
386
|
+
m.should_receive(:hi).with(FlexMock.hsh(:a => 1, :b => 2)).once
|
387
|
+
m.hi(:a => 1, :b => 2, :c => 3)
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
def test_with_hash_non_matching
|
392
|
+
FlexMock.use('greeter') do |m|
|
393
|
+
m.should_receive(:hi).with(FlexMock.hsh(:a => 1, :b => 2))
|
394
|
+
assert_failure {
|
395
|
+
m.hi(:a => 1, :b => 4, :c => 3)
|
396
|
+
}
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
360
400
|
def test_with_equal_arg_nonmatching
|
361
401
|
FlexMock.use('greeter') do |m|
|
362
402
|
m.should_receive(:hi).with(FlexMock.eq(Object)).never
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flexmock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jim Weirich
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-02-19 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -38,6 +38,8 @@ extra_rdoc_files:
|
|
38
38
|
- doc/releases/flexmock-0.7.1.rdoc
|
39
39
|
- doc/releases/flexmock-0.8.0.rdoc
|
40
40
|
- doc/releases/flexmock-0.8.2.rdoc
|
41
|
+
- doc/releases/flexmock-0.8.3.rdoc
|
42
|
+
- doc/releases/flexmock-0.8.4.rdoc
|
41
43
|
files:
|
42
44
|
- CHANGES
|
43
45
|
- Rakefile
|
@@ -107,8 +109,10 @@ files:
|
|
107
109
|
- doc/releases/flexmock-0.7.1.rdoc
|
108
110
|
- doc/releases/flexmock-0.8.0.rdoc
|
109
111
|
- doc/releases/flexmock-0.8.2.rdoc
|
112
|
+
- doc/releases/flexmock-0.8.3.rdoc
|
113
|
+
- doc/releases/flexmock-0.8.4.rdoc
|
110
114
|
has_rdoc: true
|
111
|
-
homepage: http://
|
115
|
+
homepage: http://flexmock.rubyforge.org
|
112
116
|
post_install_message:
|
113
117
|
rdoc_options:
|
114
118
|
- --title
|
@@ -133,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
137
|
requirements: []
|
134
138
|
|
135
139
|
rubyforge_project:
|
136
|
-
rubygems_version: 1.
|
140
|
+
rubygems_version: 1.3.1
|
137
141
|
signing_key:
|
138
142
|
specification_version: 2
|
139
143
|
summary: Simple and Flexible Mock Objects for Testing
|