jferris-mocha 0.9.5.0.1240002286

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 (180) hide show
  1. data/COPYING +3 -0
  2. data/MIT-LICENSE +7 -0
  3. data/README +37 -0
  4. data/RELEASE +269 -0
  5. data/Rakefile +217 -0
  6. data/examples/misc.rb +43 -0
  7. data/examples/mocha.rb +25 -0
  8. data/examples/stubba.rb +64 -0
  9. data/lib/mocha/any_instance_method.rb +55 -0
  10. data/lib/mocha/api.rb +232 -0
  11. data/lib/mocha/argument_iterator.rb +21 -0
  12. data/lib/mocha/backtrace_filter.rb +17 -0
  13. data/lib/mocha/cardinality.rb +95 -0
  14. data/lib/mocha/central.rb +27 -0
  15. data/lib/mocha/change_state_side_effect.rb +19 -0
  16. data/lib/mocha/class_method.rb +87 -0
  17. data/lib/mocha/configuration.rb +60 -0
  18. data/lib/mocha/deprecation.rb +22 -0
  19. data/lib/mocha/exception_raiser.rb +17 -0
  20. data/lib/mocha/expectation.rb +484 -0
  21. data/lib/mocha/expectation_error.rb +15 -0
  22. data/lib/mocha/expectation_list.rb +50 -0
  23. data/lib/mocha/in_state_ordering_constraint.rb +19 -0
  24. data/lib/mocha/inspect.rb +67 -0
  25. data/lib/mocha/instance_method.rb +16 -0
  26. data/lib/mocha/integration/bacon/assertion_counter.rb +23 -0
  27. data/lib/mocha/integration/bacon/version_11_and_above.rb +34 -0
  28. data/lib/mocha/integration/bacon.rb +1 -0
  29. data/lib/mocha/integration/mini_test/assertion_counter.rb +23 -0
  30. data/lib/mocha/integration/mini_test/version_131_and_above.rb +49 -0
  31. data/lib/mocha/integration/mini_test.rb +1 -0
  32. data/lib/mocha/integration/test_unit/assertion_counter.rb +23 -0
  33. data/lib/mocha/integration/test_unit/gem_version_200.rb +49 -0
  34. data/lib/mocha/integration/test_unit/gem_version_201_and_above.rb +49 -0
  35. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +48 -0
  36. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +50 -0
  37. data/lib/mocha/integration/test_unit.rb +4 -0
  38. data/lib/mocha/invocation.rb +10 -0
  39. data/lib/mocha/is_a.rb +9 -0
  40. data/lib/mocha/logger.rb +15 -0
  41. data/lib/mocha/metaclass.rb +13 -0
  42. data/lib/mocha/method_matcher.rb +21 -0
  43. data/lib/mocha/mock.rb +200 -0
  44. data/lib/mocha/mockery.rb +189 -0
  45. data/lib/mocha/module_method.rb +16 -0
  46. data/lib/mocha/multiple_yields.rb +20 -0
  47. data/lib/mocha/names.rb +53 -0
  48. data/lib/mocha/no_yields.rb +11 -0
  49. data/lib/mocha/object.rb +187 -0
  50. data/lib/mocha/parameter_matchers/all_of.rb +42 -0
  51. data/lib/mocha/parameter_matchers/any_of.rb +47 -0
  52. data/lib/mocha/parameter_matchers/any_parameters.rb +40 -0
  53. data/lib/mocha/parameter_matchers/anything.rb +33 -0
  54. data/lib/mocha/parameter_matchers/base.rb +15 -0
  55. data/lib/mocha/parameter_matchers/equals.rb +42 -0
  56. data/lib/mocha/parameter_matchers/has_entries.rb +45 -0
  57. data/lib/mocha/parameter_matchers/has_entry.rb +57 -0
  58. data/lib/mocha/parameter_matchers/has_key.rb +42 -0
  59. data/lib/mocha/parameter_matchers/has_value.rb +42 -0
  60. data/lib/mocha/parameter_matchers/includes.rb +40 -0
  61. data/lib/mocha/parameter_matchers/instance_of.rb +42 -0
  62. data/lib/mocha/parameter_matchers/is_a.rb +42 -0
  63. data/lib/mocha/parameter_matchers/kind_of.rb +42 -0
  64. data/lib/mocha/parameter_matchers/not.rb +42 -0
  65. data/lib/mocha/parameter_matchers/object.rb +15 -0
  66. data/lib/mocha/parameter_matchers/optionally.rb +55 -0
  67. data/lib/mocha/parameter_matchers/regexp_matches.rb +43 -0
  68. data/lib/mocha/parameter_matchers/responds_with.rb +43 -0
  69. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +43 -0
  70. data/lib/mocha/parameter_matchers.rb +27 -0
  71. data/lib/mocha/parameters_matcher.rb +37 -0
  72. data/lib/mocha/pretty_parameters.rb +28 -0
  73. data/lib/mocha/return_values.rb +31 -0
  74. data/lib/mocha/sequence.rb +42 -0
  75. data/lib/mocha/single_return_value.rb +17 -0
  76. data/lib/mocha/single_yield.rb +18 -0
  77. data/lib/mocha/state_machine.rb +91 -0
  78. data/lib/mocha/stubbing_error.rb +16 -0
  79. data/lib/mocha/unexpected_invocation.rb +18 -0
  80. data/lib/mocha/yield_parameters.rb +31 -0
  81. data/lib/mocha.rb +69 -0
  82. data/lib/mocha_standalone.rb +2 -0
  83. data/lib/stubba.rb +4 -0
  84. data/test/acceptance/acceptance_test_helper.rb +38 -0
  85. data/test/acceptance/api_test.rb +139 -0
  86. data/test/acceptance/bacon_spec.rb +67 -0
  87. data/test/acceptance/bacon_test.rb +110 -0
  88. data/test/acceptance/bug_18914_test.rb +43 -0
  89. data/test/acceptance/bug_21465_test.rb +34 -0
  90. data/test/acceptance/bug_21563_test.rb +25 -0
  91. data/test/acceptance/expected_invocation_count_test.rb +196 -0
  92. data/test/acceptance/failure_messages_test.rb +64 -0
  93. data/test/acceptance/minitest_test.rb +146 -0
  94. data/test/acceptance/mocha_example_test.rb +98 -0
  95. data/test/acceptance/mocha_test_result_test.rb +84 -0
  96. data/test/acceptance/mock_test.rb +100 -0
  97. data/test/acceptance/mock_with_initializer_block_test.rb +51 -0
  98. data/test/acceptance/mocked_methods_dispatch_test.rb +78 -0
  99. data/test/acceptance/optional_parameters_test.rb +70 -0
  100. data/test/acceptance/parameter_matcher_test.rb +209 -0
  101. data/test/acceptance/partial_mocks_test.rb +47 -0
  102. data/test/acceptance/return_value_test.rb +52 -0
  103. data/test/acceptance/sequence_test.rb +186 -0
  104. data/test/acceptance/spy_test.rb +109 -0
  105. data/test/acceptance/states_test.rb +70 -0
  106. data/test/acceptance/stub_any_instance_method_test.rb +195 -0
  107. data/test/acceptance/stub_class_method_test.rb +203 -0
  108. data/test/acceptance/stub_everything_test.rb +56 -0
  109. data/test/acceptance/stub_instance_method_test.rb +203 -0
  110. data/test/acceptance/stub_module_method_test.rb +163 -0
  111. data/test/acceptance/stub_test.rb +52 -0
  112. data/test/acceptance/stubba_example_test.rb +102 -0
  113. data/test/acceptance/stubba_test.rb +15 -0
  114. data/test/acceptance/stubba_test_result_test.rb +66 -0
  115. data/test/acceptance/stubbing_error_backtrace_test.rb +64 -0
  116. data/test/acceptance/stubbing_method_unnecessarily_test.rb +65 -0
  117. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +130 -0
  118. data/test/acceptance/stubbing_non_existent_class_method_test.rb +157 -0
  119. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +147 -0
  120. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +130 -0
  121. data/test/acceptance/stubbing_non_public_class_method_test.rb +163 -0
  122. data/test/acceptance/stubbing_non_public_instance_method_test.rb +143 -0
  123. data/test/acceptance/stubbing_on_non_mock_object_test.rb +64 -0
  124. data/test/deprecation_disabler.rb +15 -0
  125. data/test/execution_point.rb +36 -0
  126. data/test/matcher_helpers.rb +5 -0
  127. data/test/method_definer.rb +24 -0
  128. data/test/simple_counter.rb +13 -0
  129. data/test/test_helper.rb +16 -0
  130. data/test/test_runner.rb +33 -0
  131. data/test/unit/any_instance_method_test.rb +126 -0
  132. data/test/unit/array_inspect_test.rb +16 -0
  133. data/test/unit/assert_received_test.rb +136 -0
  134. data/test/unit/backtrace_filter_test.rb +19 -0
  135. data/test/unit/cardinality_test.rb +56 -0
  136. data/test/unit/central_test.rb +65 -0
  137. data/test/unit/change_state_side_effect_test.rb +41 -0
  138. data/test/unit/class_method_test.rb +237 -0
  139. data/test/unit/date_time_inspect_test.rb +21 -0
  140. data/test/unit/exception_raiser_test.rb +42 -0
  141. data/test/unit/expectation_list_test.rb +57 -0
  142. data/test/unit/expectation_test.rb +526 -0
  143. data/test/unit/hash_inspect_test.rb +16 -0
  144. data/test/unit/have_received_test.rb +137 -0
  145. data/test/unit/in_state_ordering_constraint_test.rb +43 -0
  146. data/test/unit/invocation_test.rb +17 -0
  147. data/test/unit/metaclass_test.rb +22 -0
  148. data/test/unit/method_matcher_test.rb +23 -0
  149. data/test/unit/mock_test.rb +329 -0
  150. data/test/unit/mockery_test.rb +163 -0
  151. data/test/unit/multiple_yields_test.rb +18 -0
  152. data/test/unit/no_yields_test.rb +18 -0
  153. data/test/unit/object_inspect_test.rb +37 -0
  154. data/test/unit/object_test.rb +82 -0
  155. data/test/unit/parameter_matchers/all_of_test.rb +26 -0
  156. data/test/unit/parameter_matchers/any_of_test.rb +26 -0
  157. data/test/unit/parameter_matchers/anything_test.rb +21 -0
  158. data/test/unit/parameter_matchers/equals_test.rb +25 -0
  159. data/test/unit/parameter_matchers/has_entries_test.rb +51 -0
  160. data/test/unit/parameter_matchers/has_entry_test.rb +82 -0
  161. data/test/unit/parameter_matchers/has_key_test.rb +36 -0
  162. data/test/unit/parameter_matchers/has_value_test.rb +37 -0
  163. data/test/unit/parameter_matchers/includes_test.rb +25 -0
  164. data/test/unit/parameter_matchers/instance_of_test.rb +25 -0
  165. data/test/unit/parameter_matchers/is_a_test.rb +25 -0
  166. data/test/unit/parameter_matchers/kind_of_test.rb +25 -0
  167. data/test/unit/parameter_matchers/not_test.rb +26 -0
  168. data/test/unit/parameter_matchers/regexp_matches_test.rb +25 -0
  169. data/test/unit/parameter_matchers/responds_with_test.rb +25 -0
  170. data/test/unit/parameter_matchers/stub_matcher.rb +27 -0
  171. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +25 -0
  172. data/test/unit/parameters_matcher_test.rb +121 -0
  173. data/test/unit/return_values_test.rb +63 -0
  174. data/test/unit/sequence_test.rb +104 -0
  175. data/test/unit/single_return_value_test.rb +14 -0
  176. data/test/unit/single_yield_test.rb +18 -0
  177. data/test/unit/state_machine_test.rb +98 -0
  178. data/test/unit/string_inspect_test.rb +11 -0
  179. data/test/unit/yield_parameters_test.rb +93 -0
  180. metadata +245 -0
@@ -0,0 +1,24 @@
1
+ require 'mocha/metaclass'
2
+
3
+ module Mocha
4
+
5
+ module ObjectMethods
6
+ def define_instance_method(method_symbol, &block)
7
+ __metaclass__.send(:define_method, method_symbol, block)
8
+ end
9
+
10
+ def replace_instance_method(method_symbol, &block)
11
+ raise "Cannot replace #{method_symbol} as #{self} does not respond to it." unless self.respond_to?(method_symbol)
12
+ define_instance_method(method_symbol, &block)
13
+ end
14
+
15
+ def define_instance_accessor(*symbols)
16
+ symbols.each { |symbol| __metaclass__.send(:attr_accessor, symbol) }
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ class Object
23
+ include Mocha::ObjectMethods
24
+ end
@@ -0,0 +1,13 @@
1
+ class SimpleCounter
2
+
3
+ attr_reader :count
4
+
5
+ def initialize
6
+ @count = 0
7
+ end
8
+
9
+ def increment
10
+ @count += 1
11
+ end
12
+
13
+ end
@@ -0,0 +1,16 @@
1
+ unless defined?(STANDARD_OBJECT_PUBLIC_INSTANCE_METHODS)
2
+ STANDARD_OBJECT_PUBLIC_INSTANCE_METHODS = Object.public_instance_methods
3
+ end
4
+
5
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
6
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__)))
7
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'unit'))
8
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'unit', 'parameter_matchers'))
9
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), 'acceptance'))
10
+
11
+ if ENV['MOCHA_OPTIONS'] == 'use_test_unit_gem'
12
+ gem 'test-unit'
13
+ end
14
+
15
+ require 'test/unit'
16
+
@@ -0,0 +1,33 @@
1
+ require 'test/unit/testresult'
2
+ require 'test/unit/testcase'
3
+
4
+ module TestRunner
5
+
6
+ def run_as_test(test_result = Test::Unit::TestResult.new, &block)
7
+ test_class = Class.new(Test::Unit::TestCase) do
8
+ define_method(:test_me, &block)
9
+ end
10
+ test = test_class.new(:test_me)
11
+ test.run(test_result) {}
12
+ class << test_result
13
+ attr_reader :failures, :errors
14
+ def failure_messages
15
+ failures.map { |failure| failure.message }
16
+ end
17
+ def error_messages
18
+ errors.map { |error| error.message }
19
+ end
20
+ end
21
+ test_result
22
+ end
23
+
24
+ def assert_passed(test_result)
25
+ flunk "Test failed unexpectedly with message: #{test_result.failures}" if test_result.failure_count > 0
26
+ flunk "Test failed unexpectedly with message: #{test_result.errors}" if test_result.error_count > 0
27
+ end
28
+
29
+ def assert_failed(test_result)
30
+ flunk "Test passed unexpectedly" if test_result.passed?
31
+ end
32
+
33
+ end
@@ -0,0 +1,126 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+ require 'method_definer'
3
+ require 'mocha/mock'
4
+ require 'mocha/any_instance_method'
5
+
6
+ class AnyInstanceMethodTest < Test::Unit::TestCase
7
+
8
+ include Mocha
9
+
10
+ def test_should_hide_original_method
11
+ klass = Class.new { def method_x; end }
12
+ method = AnyInstanceMethod.new(klass, :method_x)
13
+ hidden_method_x = method.hidden_method.to_sym
14
+
15
+ method.hide_original_method
16
+
17
+ assert klass.method_defined?(hidden_method_x)
18
+ end
19
+
20
+ def test_should_not_hide_original_method_if_it_is_not_defined
21
+ klass = Class.new
22
+ method = AnyInstanceMethod.new(klass, :method_x)
23
+ hidden_method_x = method.hidden_method.to_sym
24
+
25
+ method.hide_original_method
26
+
27
+ assert_equal false, klass.method_defined?(hidden_method_x)
28
+ end
29
+
30
+ def test_should_define_a_new_method
31
+ klass = Class.new { def method_x; end }
32
+ method = AnyInstanceMethod.new(klass, :method_x)
33
+ mocha = Mock.new
34
+ mocha.expects(:method_x).with(:param1, :param2).returns(:result)
35
+ any_instance = Object.new
36
+ any_instance.define_instance_method(:mocha) { mocha }
37
+ klass.define_instance_method(:any_instance) { any_instance }
38
+
39
+ method.hide_original_method
40
+ method.define_new_method
41
+
42
+ instance = klass.new
43
+ result = instance.method_x(:param1, :param2)
44
+
45
+ assert_equal :result, result
46
+ assert mocha.__verified__?
47
+ end
48
+
49
+ def test_should_restore_original_method
50
+ klass = Class.new { def method_x; end }
51
+ method = AnyInstanceMethod.new(klass, :method_x)
52
+ hidden_method_x = method.hidden_method.to_sym
53
+ klass.send(:define_method, hidden_method_x, Proc.new { :original_result })
54
+
55
+ method.remove_new_method
56
+ method.restore_original_method
57
+
58
+ instance = klass.new
59
+ assert_equal :original_result, instance.method_x
60
+ assert !klass.method_defined?(hidden_method_x)
61
+ end
62
+
63
+ def test_should_not_restore_original_method_if_hidden_method_not_defined
64
+ klass = Class.new { def method_x; :new_result; end }
65
+ method = AnyInstanceMethod.new(klass, :method_x)
66
+
67
+ method.restore_original_method
68
+
69
+ instance = klass.new
70
+ assert_equal :new_result, instance.method_x
71
+ end
72
+
73
+ def test_should_call_remove_new_method
74
+ klass = Class.new { def method_x; end }
75
+ any_instance = Mock.new
76
+ any_instance.stubs(:reset_mocha)
77
+ klass.define_instance_method(:any_instance) { any_instance }
78
+ method = AnyInstanceMethod.new(klass, :method_x)
79
+ method.replace_instance_method(:restore_original_method) { }
80
+ method.define_instance_accessor(:remove_called)
81
+ method.replace_instance_method(:remove_new_method) { self.remove_called = true }
82
+
83
+ method.unstub
84
+
85
+ assert method.remove_called
86
+ end
87
+
88
+ def test_should_call_restore_original_method
89
+ klass = Class.new { def method_x; end }
90
+ any_instance = Mock.new
91
+ any_instance.stubs(:reset_mocha)
92
+ klass.define_instance_method(:any_instance) { any_instance }
93
+ method = AnyInstanceMethod.new(klass, :method_x)
94
+ method.replace_instance_method(:remove_new_method) { }
95
+ method.define_instance_accessor(:restore_called)
96
+ method.replace_instance_method(:restore_original_method) { self.restore_called = true }
97
+
98
+ method.unstub
99
+
100
+ assert method.restore_called
101
+ end
102
+
103
+ def test_should_call_reset_mocha
104
+ klass = Class.new { def method_x; end }
105
+ any_instance = Class.new { attr_accessor :mocha_was_reset; def reset_mocha; self.mocha_was_reset = true; end }.new
106
+ klass.define_instance_method(:any_instance) { any_instance }
107
+ method = AnyInstanceMethod.new(klass, :method_x)
108
+ method.replace_instance_method(:remove_new_method) { }
109
+ method.replace_instance_method(:restore_original_method) { }
110
+
111
+ method.unstub
112
+
113
+ assert any_instance.mocha_was_reset
114
+ end
115
+
116
+ def test_should_return_any_instance_mocha_for_stubbee
117
+ mocha = Object.new
118
+ any_instance = Object.new
119
+ any_instance.define_instance_method(:mocha) { mocha }
120
+ stubbee = Class.new
121
+ stubbee.define_instance_method(:any_instance) { any_instance }
122
+ method = AnyInstanceMethod.new(stubbee, :method_name)
123
+ assert_equal stubbee.any_instance.mocha, method.mock
124
+ end
125
+
126
+ end
@@ -0,0 +1,16 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+ require 'mocha/inspect'
3
+
4
+ class ArrayInspectTest < Test::Unit::TestCase
5
+
6
+ def test_should_use_inspect
7
+ array = [1, 2]
8
+ assert_equal array.inspect, array.mocha_inspect
9
+ end
10
+
11
+ def test_should_use_mocha_inspect_on_each_item
12
+ array = [1, 2, "chris"]
13
+ assert_equal "[1, 2, 'chris']", array.mocha_inspect
14
+ end
15
+
16
+ end
@@ -0,0 +1,136 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+ require 'test_runner'
3
+ require 'mocha/api'
4
+ require 'mocha/mockery'
5
+ require 'mocha/object'
6
+
7
+ class AssertReceivedTest < Test::Unit::TestCase
8
+
9
+ include Mocha
10
+ include TestRunner
11
+ include Mocha::API
12
+
13
+ def teardown
14
+ Mockery.reset_instance
15
+ end
16
+
17
+ class FakeMock
18
+ def initialize(name)
19
+ @name = name
20
+ end
21
+
22
+ def inspect
23
+ @name
24
+ end
25
+
26
+ def mocha
27
+ self
28
+ end
29
+ end
30
+
31
+ def test_passes_if_invocation_exists
32
+ method = :a_method
33
+ mock = FakeMock.new('a mock')
34
+ Mockery.instance.invocation(mock, method, [])
35
+ assert_passes do
36
+ assert_received(mock, method)
37
+ end
38
+ end
39
+
40
+ def test_fails_if_invocation_doesnt_exist
41
+ method = :a_method
42
+ mock = FakeMock.new('a mock')
43
+ assert_fails do
44
+ assert_received(mock, method)
45
+ end
46
+ end
47
+
48
+ def test_fails_if_invocation_exists_with_different_arguments
49
+ method = :a_method
50
+ mock = FakeMock.new('a mock')
51
+ Mockery.instance.invocation(mock, method, [2, 1])
52
+ assert_fails do
53
+ assert_received(mock, method) {|expect| expect.with(1, 2) }
54
+ end
55
+ end
56
+
57
+ def test_passes_if_invocation_exists_with_wildcard_arguments
58
+ method = :a_method
59
+ mock = FakeMock.new('a mock')
60
+ Mockery.instance.invocation(mock, method, ['hello'])
61
+ assert_passes do
62
+ assert_received(mock, method) {|expect| expect.with(is_a(String)) }
63
+ end
64
+ end
65
+
66
+ def test_passes_if_invocation_exists_with_exact_arguments
67
+ method = :a_method
68
+ mock = FakeMock.new('a mock')
69
+ Mockery.instance.invocation(mock, method, ['hello'])
70
+ assert_passes do
71
+ assert_received(mock, method) {|expect| expect.with('hello') }
72
+ end
73
+ end
74
+
75
+ def test_fails_if_invocation_exists_only_on_other_mock
76
+ method = :a_method
77
+ mock = FakeMock.new('a mock')
78
+ other = 'another mock'
79
+ Mockery.instance.invocation(other, method, ['hello'])
80
+ assert_fails do
81
+ assert_received(mock, method)
82
+ end
83
+ end
84
+
85
+ def test_passes_if_invocation_exists_for_impersonating_mock
86
+ method = :a_method
87
+ object = Object.new
88
+ mock = FakeMock.new('a mock')
89
+
90
+ class << object
91
+ attr_accessor :mocha
92
+ end
93
+ object.mocha = mock
94
+
95
+ Mockery.instance.invocation(mock, method, ['hello'])
96
+ assert_passes do
97
+ assert_received(object, method) {|expect| expect.with('hello') }
98
+ end
99
+ end
100
+
101
+ def test_passes_if_invocation_count_correct
102
+ method = :a_method
103
+ mock = FakeMock.new('a mock')
104
+ 2.times { Mockery.instance.invocation(mock, method, []) }
105
+ assert_passes do
106
+ assert_received(mock, method) {|expect| expect.twice }
107
+ end
108
+ end
109
+
110
+ def test_fails_if_invocation_count_incorrect
111
+ method = :a_method
112
+ mock = FakeMock.new('a mock')
113
+ Mockery.instance.invocation(mock, method, [])
114
+ assert_fails do
115
+ assert_received(mock, method) {|expect| expect.twice }
116
+ end
117
+ end
118
+
119
+ def assert_passes(&block)
120
+ assert ! fails?(&block)
121
+ end
122
+
123
+ def assert_fails(&block)
124
+ assert fails?(&block)
125
+ end
126
+
127
+ def fails?
128
+ begin
129
+ yield
130
+ false
131
+ rescue Test::Unit::AssertionFailedError
132
+ true
133
+ end
134
+ end
135
+
136
+ end
@@ -0,0 +1,19 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+ require 'mocha/backtrace_filter'
3
+
4
+ class BacktraceFilterTest < Test::Unit::TestCase
5
+
6
+ include Mocha
7
+
8
+ def test_should_exclude_mocha_locations_from_backtrace
9
+ mocha_lib = "/username/workspace/mocha_wibble/lib/"
10
+ backtrace = [ mocha_lib + 'exclude/me/1', mocha_lib + 'exclude/me/2', '/keep/me', mocha_lib + 'exclude/me/3']
11
+ filter = BacktraceFilter.new(mocha_lib)
12
+ assert_equal ['/keep/me'], filter.filtered(backtrace)
13
+ end
14
+
15
+ def test_should_determine_path_for_mocha_lib_directory
16
+ assert_match Regexp.new("/lib/$"), BacktraceFilter::LIB_DIRECTORY
17
+ end
18
+
19
+ end
@@ -0,0 +1,56 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+ require 'mocha/cardinality'
3
+
4
+ class CardinalityTest < Test::Unit::TestCase
5
+
6
+ include Mocha
7
+
8
+ def test_should_allow_invocations_if_invocation_count_has_not_yet_reached_maximum
9
+ cardinality = Cardinality.new(2, 3)
10
+ assert cardinality.invocations_allowed?(0)
11
+ assert cardinality.invocations_allowed?(1)
12
+ assert cardinality.invocations_allowed?(2)
13
+ assert !cardinality.invocations_allowed?(3)
14
+ end
15
+
16
+ def test_should_be_satisfied_if_invocations_so_far_have_reached_required_threshold
17
+ cardinality = Cardinality.new(2, 3)
18
+ assert !cardinality.satisfied?(0)
19
+ assert !cardinality.satisfied?(1)
20
+ assert cardinality.satisfied?(2)
21
+ assert cardinality.satisfied?(3)
22
+ end
23
+
24
+ def test_should_describe_cardinality
25
+ assert_equal 'allowed any number of times', Cardinality.at_least(0).mocha_inspect
26
+
27
+ assert_equal 'expected at most once', Cardinality.at_most(1).mocha_inspect
28
+ assert_equal 'expected at most twice', Cardinality.at_most(2).mocha_inspect
29
+ assert_equal 'expected at most 3 times', Cardinality.at_most(3).mocha_inspect
30
+
31
+ assert_equal 'expected at least once', Cardinality.at_least(1).mocha_inspect
32
+ assert_equal 'expected at least twice', Cardinality.at_least(2).mocha_inspect
33
+ assert_equal 'expected at least 3 times', Cardinality.at_least(3).mocha_inspect
34
+
35
+ assert_equal 'expected never', Cardinality.exactly(0).mocha_inspect
36
+ assert_equal 'expected exactly once', Cardinality.exactly(1).mocha_inspect
37
+ assert_equal 'expected exactly twice', Cardinality.exactly(2).mocha_inspect
38
+ assert_equal 'expected exactly 3 times', Cardinality.times(3).mocha_inspect
39
+
40
+ assert_equal 'expected between 2 and 4 times', Cardinality.times(2..4).mocha_inspect
41
+ assert_equal 'expected between 1 and 3 times', Cardinality.times(1..3).mocha_inspect
42
+ end
43
+
44
+ def test_should_need_verifying
45
+ assert Cardinality.exactly(2).needs_verifying?
46
+ assert Cardinality.at_least(3).needs_verifying?
47
+ assert Cardinality.at_most(2).needs_verifying?
48
+ assert Cardinality.times(4).needs_verifying?
49
+ assert Cardinality.times(2..4).needs_verifying?
50
+ end
51
+
52
+ def test_should_not_need_verifying
53
+ assert_equal false, Cardinality.at_least(0).needs_verifying?
54
+ end
55
+
56
+ end
@@ -0,0 +1,65 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+
3
+ require 'mocha/central'
4
+ require 'mocha/mock'
5
+ require 'method_definer'
6
+
7
+ class CentralTest < Test::Unit::TestCase
8
+
9
+ include Mocha
10
+
11
+ def test_should_start_with_empty_stubba_methods
12
+ stubba = Central.new
13
+
14
+ assert_equal [], stubba.stubba_methods
15
+ end
16
+
17
+ def test_should_stub_method_if_not_already_stubbed
18
+ method = Mock.new
19
+ method.expects(:stub)
20
+ stubba = Central.new
21
+
22
+ stubba.stub(method)
23
+
24
+ assert method.__verified__?
25
+ end
26
+
27
+ def test_should_not_stub_method_if_already_stubbed
28
+ method = Mock.new
29
+ method.expects(:stub).times(0)
30
+ stubba = Central.new
31
+ stubba_methods = Mock.new
32
+ stubba_methods.stubs(:include?).with(method).returns(true)
33
+ stubba.stubba_methods = stubba_methods
34
+
35
+ stubba.stub(method)
36
+
37
+ assert method.__verified__?
38
+ end
39
+
40
+ def test_should_record_method
41
+ method = Mock.new
42
+ method.expects(:stub)
43
+ stubba = Central.new
44
+
45
+ stubba.stub(method)
46
+
47
+ assert_equal [method], stubba.stubba_methods
48
+ end
49
+
50
+ def test_should_unstub_all_methods
51
+ stubba = Central.new
52
+ method_1 = Mock.new
53
+ method_1.expects(:unstub)
54
+ method_2 = Mock.new
55
+ method_2.expects(:unstub)
56
+ stubba.stubba_methods = [method_1, method_2]
57
+
58
+ stubba.unstub_all
59
+
60
+ assert_equal [], stubba.stubba_methods
61
+ assert method_1.__verified__?
62
+ assert method_2.__verified__?
63
+ end
64
+
65
+ end
@@ -0,0 +1,41 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+
3
+ require 'mocha/change_state_side_effect'
4
+
5
+ class ChangeStateSideEffectTest < Test::Unit::TestCase
6
+
7
+ include Mocha
8
+
9
+ class FakeState
10
+
11
+ attr_reader :active
12
+ attr_writer :description
13
+
14
+ def activate
15
+ @active = true
16
+ end
17
+
18
+ def mocha_inspect
19
+ @description
20
+ end
21
+
22
+ end
23
+
24
+ def test_should_activate_the_given_state
25
+ state = FakeState.new
26
+ side_effect = ChangeStateSideEffect.new(state)
27
+
28
+ side_effect.perform
29
+
30
+ assert state.active
31
+ end
32
+
33
+ def test_should_describe_itself_in_terms_of_the_activated_state
34
+ state = FakeState.new
35
+ state.description = 'the-new-state'
36
+ side_effect = ChangeStateSideEffect.new(state)
37
+
38
+ assert_equal 'then the-new-state', side_effect.mocha_inspect
39
+ end
40
+
41
+ end