rspec 0.7.5.1 → 0.8.0

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 (194) hide show
  1. data/CHANGES +60 -1
  2. data/EXAMPLES.rd +38 -19
  3. data/MIT-LICENSE +1 -1
  4. data/README +24 -17
  5. data/RELEASE-PLAN +117 -0
  6. data/Rakefile +24 -18
  7. data/TODO.0.8.0 +5 -0
  8. data/examples/auto_spec_name_generation_example.rb +18 -0
  9. data/examples/custom_expectation_matchers.rb +53 -0
  10. data/examples/dynamic_spec.rb +9 -0
  11. data/examples/io_processor_spec.rb +2 -2
  12. data/examples/mocking_example.rb +4 -4
  13. data/examples/partial_mock_example.rb +2 -2
  14. data/examples/predicate_example.rb +2 -2
  15. data/examples/stack_spec.rb +32 -36
  16. data/examples/stubbing_example.rb +19 -19
  17. data/examples/test_case_spec.rb +6 -6
  18. data/lib/spec.rb +3 -0
  19. data/lib/spec/callback.rb +8 -0
  20. data/lib/spec/callback/extensions/object.rb +4 -0
  21. data/lib/spec/deprecated.rb +3 -0
  22. data/lib/spec/expectations.rb +44 -17
  23. data/lib/spec/expectations/extensions.rb +1 -2
  24. data/lib/spec/expectations/extensions/object.rb +78 -130
  25. data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
  26. data/lib/spec/expectations/handler.rb +47 -0
  27. data/lib/spec/expectations/should/base.rb +32 -29
  28. data/lib/spec/expectations/should/change.rb +1 -1
  29. data/lib/spec/expectations/should/have.rb +9 -17
  30. data/lib/spec/expectations/should/not.rb +54 -56
  31. data/lib/spec/expectations/should/should.rb +59 -65
  32. data/lib/spec/expectations/sugar.rb +27 -4
  33. data/lib/spec/matchers.rb +160 -0
  34. data/lib/spec/matchers/be.rb +161 -0
  35. data/lib/spec/matchers/be_close.rb +37 -0
  36. data/lib/spec/matchers/change.rb +120 -0
  37. data/lib/spec/matchers/eql.rb +43 -0
  38. data/lib/spec/matchers/equal.rb +43 -0
  39. data/lib/spec/matchers/has.rb +44 -0
  40. data/lib/spec/matchers/have.rb +140 -0
  41. data/lib/spec/matchers/include.rb +50 -0
  42. data/lib/spec/matchers/match.rb +41 -0
  43. data/lib/spec/matchers/raise_error.rb +100 -0
  44. data/lib/spec/matchers/respond_to.rb +35 -0
  45. data/lib/spec/matchers/satisfy.rb +47 -0
  46. data/lib/spec/matchers/throw_symbol.rb +75 -0
  47. data/lib/spec/mocks.rb +224 -1
  48. data/lib/spec/mocks/argument_expectation.rb +16 -2
  49. data/lib/spec/mocks/error_generator.rb +5 -3
  50. data/lib/spec/mocks/errors.rb +2 -2
  51. data/lib/spec/mocks/extensions/object.rb +1 -1
  52. data/lib/spec/mocks/message_expectation.rb +29 -19
  53. data/lib/spec/mocks/{mock_methods.rb → methods.rb} +5 -5
  54. data/lib/spec/mocks/mock.rb +2 -2
  55. data/lib/spec/mocks/mock_handler.rb +81 -68
  56. data/lib/spec/rake/spectask.rb +7 -12
  57. data/lib/spec/rake/verify_rcov.rb +1 -1
  58. data/lib/spec/runner.rb +117 -0
  59. data/lib/spec/runner/command_line.rb +8 -5
  60. data/lib/spec/runner/context.rb +13 -37
  61. data/lib/spec/runner/context_eval.rb +4 -3
  62. data/lib/spec/runner/context_runner.rb +7 -4
  63. data/lib/spec/runner/drb_command_line.rb +1 -1
  64. data/lib/spec/runner/execution_context.rb +3 -11
  65. data/lib/spec/runner/extensions/kernel.rb +7 -5
  66. data/lib/spec/runner/extensions/object.rb +4 -1
  67. data/lib/spec/runner/formatter/base_text_formatter.rb +11 -3
  68. data/lib/spec/runner/formatter/html_formatter.rb +21 -10
  69. data/lib/spec/runner/heckle_runner.rb +24 -8
  70. data/lib/spec/runner/heckle_runner_win.rb +10 -0
  71. data/lib/spec/runner/option_parser.rb +58 -13
  72. data/lib/spec/runner/spec_matcher.rb +22 -29
  73. data/lib/spec/runner/spec_parser.rb +1 -0
  74. data/lib/spec/runner/specification.rb +36 -22
  75. data/lib/spec/translator.rb +87 -0
  76. data/lib/spec/version.rb +16 -7
  77. data/spec/spec/callback/callback_container_spec.rb +27 -0
  78. data/spec/spec/callback/module_spec.rb +37 -0
  79. data/spec/spec/callback/object_spec.rb +90 -0
  80. data/spec/spec/callback/object_with_class_callback_spec.rb +19 -0
  81. data/spec/spec/expectations/differs/default_spec.rb +107 -0
  82. data/spec/spec/expectations/extensions/object_spec.rb +46 -0
  83. data/spec/spec/expectations/fail_with_spec.rb +71 -0
  84. data/spec/spec/expectations/should/should_==_spec.rb +19 -0
  85. data/spec/spec/expectations/should/should_=~_spec.rb +13 -0
  86. data/spec/spec/expectations/should/should_be_a_kind_of_spec.rb +21 -0
  87. data/spec/spec/expectations/should/should_be_an_instance_of_spec.rb +30 -0
  88. data/spec/spec/expectations/should/should_be_arbitrary_predicate_spec.rb +81 -0
  89. data/spec/spec/expectations/should/should_be_close_spec.rb +18 -0
  90. data/spec/spec/expectations/should/should_be_comparison_operator_spec.rb +44 -0
  91. data/spec/spec/expectations/should/should_be_false_spec.rb +39 -0
  92. data/spec/spec/expectations/should/should_be_spec.rb +11 -0
  93. data/spec/spec/expectations/should/should_be_true_spec.rb +27 -0
  94. data/spec/spec/expectations/should/should_change_spec.rb +184 -0
  95. data/spec/spec/expectations/should/should_eql_spec.rb +11 -0
  96. data/spec/spec/expectations/should/should_equal_spec.rb +11 -0
  97. data/spec/spec/expectations/should/should_have_at_least_spec.rb +53 -0
  98. data/spec/spec/expectations/should/should_have_at_most_spec.rb +45 -0
  99. data/spec/spec/expectations/should/should_have_key_spec.rb +21 -0
  100. data/spec/spec/expectations/should/should_have_spec.rb +64 -0
  101. data/spec/spec/expectations/should/should_include_spec.rb +59 -0
  102. data/spec/spec/expectations/should/should_match_spec.rb +25 -0
  103. data/spec/spec/expectations/should/should_not_==_spec.rb +15 -0
  104. data/spec/spec/expectations/should/should_not_be_a_kind_of_spec.rb +21 -0
  105. data/spec/spec/expectations/should/should_not_be_an_instance_of_spec.rb +11 -0
  106. data/spec/spec/expectations/should/should_not_be_arbitrary_predicate_spec.rb +68 -0
  107. data/spec/spec/expectations/should/should_not_be_spec.rb +11 -0
  108. data/spec/spec/expectations/should/should_not_change_spec.rb +24 -0
  109. data/spec/spec/expectations/should/should_not_eql_spec.rb +11 -0
  110. data/spec/spec/expectations/should/should_not_equal_spec.rb +11 -0
  111. data/spec/spec/expectations/should/should_not_have_key_spec.rb +15 -0
  112. data/spec/spec/expectations/should/should_not_include_spec.rb +58 -0
  113. data/spec/spec/expectations/should/should_not_match_spec.rb +11 -0
  114. data/spec/spec/expectations/should/should_not_raise_spec.rb +75 -0
  115. data/spec/spec/expectations/should/should_not_respond_to_spec.rb +15 -0
  116. data/spec/spec/expectations/should/should_not_throw_spec.rb +35 -0
  117. data/spec/spec/expectations/should/should_raise_spec.rb +66 -0
  118. data/spec/spec/expectations/should/should_respond_to_spec.rb +15 -0
  119. data/spec/spec/expectations/should/should_satisfy_spec.rb +35 -0
  120. data/spec/spec/expectations/should/should_throw_spec.rb +27 -0
  121. data/spec/spec/matchers/be_close_spec.rb +33 -0
  122. data/spec/spec/matchers/be_spec.rb +182 -0
  123. data/spec/spec/matchers/change_spec.rb +232 -0
  124. data/spec/spec/matchers/description_generation_spec.rb +147 -0
  125. data/spec/spec/matchers/eql_spec.rb +41 -0
  126. data/spec/spec/matchers/equal_spec.rb +41 -0
  127. data/spec/spec/matchers/handler_spec.rb +75 -0
  128. data/spec/spec/matchers/has_spec.rb +37 -0
  129. data/spec/spec/matchers/have_spec.rb +259 -0
  130. data/spec/spec/matchers/include_spec.rb +33 -0
  131. data/spec/spec/matchers/match_spec.rb +37 -0
  132. data/spec/spec/matchers/matcher_methods_spec.rb +85 -0
  133. data/spec/spec/matchers/raise_error_spec.rb +147 -0
  134. data/spec/spec/matchers/respond_to_spec.rb +30 -0
  135. data/spec/spec/matchers/satisfy_spec.rb +36 -0
  136. data/spec/spec/matchers/throw_symbol_spec.rb +59 -0
  137. data/spec/spec/mocks/any_number_of_times_spec.rb +34 -0
  138. data/spec/spec/mocks/at_least_spec.rb +97 -0
  139. data/spec/spec/mocks/at_most_spec.rb +97 -0
  140. data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
  141. data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
  142. data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
  143. data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
  144. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +74 -0
  145. data/spec/spec/mocks/mock_ordering_spec.rb +80 -0
  146. data/spec/spec/mocks/mock_spec.rb +407 -0
  147. data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
  148. data/spec/spec/mocks/null_object_mock_spec.rb +40 -0
  149. data/spec/spec/mocks/once_counts_spec.rb +56 -0
  150. data/spec/spec/mocks/options_hash_spec.rb +31 -0
  151. data/spec/spec/mocks/partial_mock_spec.rb +52 -0
  152. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +64 -0
  153. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +92 -0
  154. data/spec/spec/mocks/precise_counts_spec.rb +56 -0
  155. data/spec/spec/mocks/record_messages_spec.rb +26 -0
  156. data/spec/spec/mocks/stub_spec.rb +159 -0
  157. data/spec/spec/mocks/twice_counts_spec.rb +67 -0
  158. data/spec/spec/runner/command_line_spec.rb +32 -0
  159. data/spec/spec/runner/context_matching_spec.rb +28 -0
  160. data/spec/spec/runner/context_runner_spec.rb +100 -0
  161. data/spec/spec/runner/context_spec.rb +405 -0
  162. data/spec/spec/runner/drb_command_line_spec.rb +74 -0
  163. data/spec/spec/runner/execution_context_spec.rb +52 -0
  164. data/spec/spec/runner/formatter/html_formatter_spec.rb +40 -0
  165. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +21 -0
  166. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +36 -0
  167. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +78 -0
  168. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +18 -0
  169. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +41 -0
  170. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +21 -0
  171. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +46 -0
  172. data/spec/spec/runner/heckle_runner_spec.rb +63 -0
  173. data/spec/spec/runner/heckler_spec.rb +14 -0
  174. data/spec/spec/runner/kernel_ext_spec.rb +16 -0
  175. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
  176. data/spec/spec/runner/object_ext_spec.rb +11 -0
  177. data/spec/spec/runner/option_parser_spec.rb +269 -0
  178. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +47 -0
  179. data/spec/spec/runner/reporter_spec.rb +126 -0
  180. data/spec/spec/runner/spec_matcher_spec.rb +107 -0
  181. data/spec/spec/runner/spec_name_generation_spec.rb +102 -0
  182. data/spec/spec/runner/spec_parser_spec.rb +37 -0
  183. data/spec/spec/runner/specification_class_spec.rb +72 -0
  184. data/spec/spec/runner/specification_instance_spec.rb +160 -0
  185. data/spec/spec/runner/specification_should_raise_spec.rb +136 -0
  186. data/spec/spec/spec_classes.rb +102 -0
  187. data/spec/spec/translator_spec.rb +79 -0
  188. data/spec/spec_helper.rb +35 -0
  189. metadata +141 -9
  190. data/bin/drbspec +0 -3
  191. data/lib/spec/expectations/diff.rb +0 -28
  192. data/lib/spec/expectations/extensions/numeric.rb +0 -19
  193. data/lib/spec/expectations/extensions/string.rb +0 -22
  194. data/lib/spec/expectations/message_builder.rb +0 -13
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "a mock acting as a NullObject" do
6
+ setup do
7
+ @mock = Mock.new("null_object", :null_object => true)
8
+ end
9
+
10
+ specify "should allow explicit expectation" do
11
+ @mock.should_receive(:something)
12
+ @mock.something
13
+ end
14
+
15
+ specify "should fail verification when explicit exception not met" do
16
+ lambda do
17
+ @mock.should_receive(:something)
18
+ @mock.__verify
19
+ end.should_raise(MockExpectationError)
20
+ end
21
+
22
+ specify "should ignore unexpected methods" do
23
+ @mock.random_call("a", "d", "c")
24
+ @mock.__verify
25
+ end
26
+
27
+ specify "should expected message with different args first" do
28
+ @mock.should_receive(:message).with(:expected_arg)
29
+ @mock.message(:unexpected_arg)
30
+ @mock.message(:expected_arg)
31
+ end
32
+
33
+ specify "should expected message with different args second" do
34
+ @mock.should_receive(:message).with(:expected_arg)
35
+ @mock.message(:expected_arg)
36
+ @mock.message(:unexpected_arg)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,56 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "OnceCounts" do
6
+ setup do
7
+ @mock = Mock.new("test mock", {
8
+ :auto_verify => false
9
+ })
10
+
11
+ end
12
+ specify "once should fail when called once with wrong args" do
13
+ @mock.should_receive(:random_call).once.with("a", "b", "c")
14
+ lambda do
15
+ @mock.random_call("d", "e", "f")
16
+ end.should_raise(MockExpectationError)
17
+
18
+ end
19
+ specify "once should fail when called twice" do
20
+ @mock.should_receive(:random_call).once
21
+ @mock.random_call
22
+ @mock.random_call
23
+ lambda do
24
+ @mock.__verify
25
+ end.should_raise(MockExpectationError)
26
+
27
+ end
28
+ specify "once should fail when not called" do
29
+ @mock.should_receive(:random_call).once
30
+ lambda do
31
+ @mock.__verify
32
+ end.should_raise(MockExpectationError)
33
+
34
+ end
35
+ specify "once should pass when called once" do
36
+ @mock.should_receive(:random_call).once
37
+ @mock.random_call
38
+ @mock.__verify
39
+
40
+ end
41
+ specify "once should pass when called once with specified args" do
42
+ @mock.should_receive(:random_call).once.with("a", "b", "c")
43
+ @mock.random_call("a", "b", "c")
44
+ @mock.__verify
45
+
46
+ end
47
+ specify "once should pass when called once with unspecified args" do
48
+ @mock.should_receive(:random_call).once
49
+ @mock.random_call("a", "b", "c")
50
+ @mock.__verify
51
+
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "calling :should_receive with an options hash" do
6
+ specify "should report the file and line submitted with :expected_from" do
7
+ spec = Spec::Runner::Specification.new "spec" do
8
+ mock = Spec::Mocks::Mock.new("a mock")
9
+ mock.should_receive(:message, :expected_from => "/path/to/blah.ext:37")
10
+ end
11
+ reporter = mock("reporter", :null_object => true)
12
+ reporter.should_receive(:spec_finished) do |spec, error|
13
+ error.backtrace.detect {|line| line =~ /\/path\/to\/blah.ext:37/}.should_not_be nil
14
+ end
15
+ spec.run(reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
16
+ end
17
+
18
+ specify "should use the message supplied with :message" do
19
+ spec = Spec::Runner::Specification.new "spec" do
20
+ mock = Spec::Mocks::Mock.new("a mock")
21
+ mock.should_receive(:message, :message => "recebi nada")
22
+ end
23
+ reporter = mock("reporter", :null_object => true)
24
+ reporter.should_receive(:spec_finished) do |spec, error|
25
+ error.message.should == "recebi nada"
26
+ end
27
+ spec.run(reporter, nil, nil, nil, ::Spec::Runner::ExecutionContext.new(nil))
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "using a Partial Mock," do
6
+ setup do
7
+ @object = Object.new
8
+ end
9
+
10
+ specify "should_not_receive should mock out the method" do
11
+ @object.should_not_receive(:fuhbar)
12
+ @object.fuhbar
13
+ lambda do
14
+ @object.__verify
15
+ end.should_raise(Spec::Mocks::MockExpectationError)
16
+ end
17
+
18
+ specify "should_not_receive should return a negative message expectation" do
19
+ @object.should_not_receive(:foobar).should_be_kind_of(NegativeMessageExpectation)
20
+ end
21
+
22
+ specify "should_receive should mock out the method" do
23
+ @object.should_receive(:foobar).with(:test_param).and_return(1)
24
+ @object.foobar(:test_param).should equal(1)
25
+ end
26
+
27
+ specify "should_receive should handle a hash" do
28
+ @object.should_receive(:foobar).with(:key => "value").and_return(1)
29
+ @object.foobar(:key => "value").should equal(1)
30
+ end
31
+
32
+ specify "should_receive should handle an inner hash" do
33
+ hash = {:a => {:key => "value"}}
34
+ @object.should_receive(:foobar).with(:key => "value").and_return(1)
35
+ @object.foobar(hash[:a]).should equal(1)
36
+ end
37
+
38
+ specify "should_receive should return a message expectation" do
39
+ @object.should_receive(:foobar).should_be_kind_of(MessageExpectation)
40
+ @object.foobar
41
+ end
42
+
43
+ specify "should_receive should verify method was called" do
44
+ @object.should_receive(:foobar).with(:test_param).and_return(1)
45
+ lambda do
46
+ @object.__verify
47
+ end.should_raise(Spec::Mocks::MockExpectationError)
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "PartialMockUsingMocksDirectly" do
6
+ setup do
7
+
8
+ klass=Class.new
9
+ klass.class_eval do
10
+ def existing_method
11
+ :original_value
12
+ end
13
+ end
14
+ @obj = klass.new
15
+
16
+ end
17
+ specify "should clear expectations on verify" do
18
+ @obj.should_receive(:msg)
19
+ @obj.msg
20
+ @obj.__verify
21
+ lambda do
22
+ @obj.msg
23
+ end.should_raise(NoMethodError)
24
+
25
+ end
26
+ specify "should fail when expected message is not received" do
27
+ @obj.should_receive(:msg)
28
+ lambda do
29
+ @obj.__verify
30
+ end.should_raise(MockExpectationError)
31
+
32
+ end
33
+ specify "should fail when message is received with incorrect args" do
34
+ @obj.should_receive(:msg).with(:correct_arg)
35
+ lambda do
36
+ @obj.msg(:incorrect_arg)
37
+ end.should_raise(MockExpectationError)
38
+ @obj.msg(:correct_arg)
39
+
40
+ end
41
+ specify "should pass when expected message is received" do
42
+ @obj.should_receive(:msg)
43
+ @obj.msg
44
+ @obj.__verify
45
+
46
+ end
47
+ specify "should pass when message is received with correct args" do
48
+ @obj.should_receive(:msg).with(:correct_arg)
49
+ @obj.msg(:correct_arg)
50
+ @obj.__verify
51
+
52
+ end
53
+ specify "should revert to original method if existed" do
54
+ @obj.existing_method.should equal(:original_value)
55
+ @obj.should_receive(:existing_method).and_return(:mock_value)
56
+ @obj.existing_method.should equal(:mock_value)
57
+ @obj.__verify
58
+ @obj.existing_method.should equal(:original_value)
59
+
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,92 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "a mock, in handling arguments" do
6
+ setup do
7
+ @mock = Mock.new("test mock")
8
+ end
9
+
10
+ teardown do
11
+ @mock.__verify
12
+ end
13
+
14
+ specify "should accept true as boolean" do
15
+ @mock.should_receive(:random_call).with(:boolean)
16
+ @mock.random_call(true)
17
+ end
18
+
19
+ specify "should accept false as boolean" do
20
+ @mock.should_receive(:random_call).with(:boolean)
21
+ @mock.random_call(false)
22
+ end
23
+
24
+ specify "should accept fixnum as numeric" do
25
+ @mock.should_receive(:random_call).with(:numeric)
26
+ @mock.random_call(1)
27
+ end
28
+
29
+ specify "should accept float as numeric" do
30
+ @mock.should_receive(:random_call).with(:numeric)
31
+ @mock.random_call(1.5)
32
+ end
33
+
34
+ specify "should accept string as anything" do
35
+ @mock.should_receive(:random_call).with("a", :anything, "c")
36
+ @mock.random_call("a", "whatever", "c")
37
+ end
38
+
39
+ specify "should match duck type with one method" do
40
+ @mock.should_receive(:random_call).with(DuckTypeArgConstraint.new(:length))
41
+ @mock.random_call([])
42
+ end
43
+
44
+ specify "should match duck type with two methods" do
45
+ @mock.should_receive(:random_call).with(DuckTypeArgConstraint.new(:abs, :div))
46
+ @mock.random_call(1)
47
+ end
48
+
49
+ specify "should match non special symbol" do
50
+ @mock.should_receive(:random_call).with(:some_symbol)
51
+ @mock.random_call(:some_symbol)
52
+ end
53
+
54
+ specify "should match string" do
55
+ @mock.should_receive(:random_call).with(:string)
56
+ @mock.random_call("a string")
57
+ end
58
+
59
+ specify "should match string against regexp" do
60
+ @mock.should_receive(:random_call).with(/bcd/)
61
+ @mock.random_call("abcde")
62
+ end
63
+
64
+ specify "should match regexp against regexp" do
65
+ @mock.should_receive(:random_call).with(/bcd/)
66
+ @mock.random_call(/bcd/)
67
+ end
68
+
69
+ specify "should match against a hash submitted and received by value" do
70
+ @mock.should_receive(:random_call).with(:a => "a", :b => "b")
71
+ @mock.random_call(:a => "a", :b => "b")
72
+ end
73
+
74
+ specify "should match against a hash submitted by reference and received by value" do
75
+ opts = {:a => "a", :b => "b"}
76
+ @mock.should_receive(:random_call).with(opts)
77
+ @mock.random_call(:a => "a", :b => "b")
78
+ end
79
+
80
+ specify "should match against a hash submitted by value and received by reference" do
81
+ opts = {:a => "a", :b => "b"}
82
+ @mock.should_receive(:random_call).with(:a => "a", :b => "b")
83
+ @mock.random_call(opts)
84
+ end
85
+
86
+ specify "should match against a Matcher" do
87
+ @mock.should_receive(:msg).with(equal(37))
88
+ @mock.msg(37)
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,56 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "PreciseCounts" do
6
+ setup do
7
+ @mock = Mock.new("test mock", {
8
+ :auto_verify => false
9
+ })
10
+
11
+ end
12
+ specify "should fail when exactly n times method is called less than n times" do
13
+ @mock.should_receive(:random_call).exactly(3).times
14
+ @mock.random_call
15
+ @mock.random_call
16
+ lambda do
17
+ @mock.__verify
18
+ end.should_raise(MockExpectationError)
19
+
20
+ end
21
+ specify "should fail when exactly n times method is never called" do
22
+ @mock.should_receive(:random_call).exactly(3).times
23
+ lambda do
24
+ @mock.__verify
25
+ end.should_raise(MockExpectationError)
26
+
27
+ end
28
+ specify "should pass if exactly n times method is called exactly n times" do
29
+ @mock.should_receive(:random_call).exactly(3).times
30
+ @mock.random_call
31
+ @mock.random_call
32
+ @mock.random_call
33
+ @mock.__verify
34
+
35
+ end
36
+ specify "should pass multiple calls with different args and counts" do
37
+ @mock.should_receive(:random_call).twice.with(1)
38
+ @mock.should_receive(:random_call).once.with(2)
39
+ @mock.random_call(1)
40
+ @mock.random_call(2)
41
+ @mock.random_call(1)
42
+ @mock.__verify
43
+
44
+ end
45
+ specify "should pass mutiple calls with different args" do
46
+ @mock.should_receive(:random_call).once.with(1)
47
+ @mock.should_receive(:random_call).once.with(2)
48
+ @mock.random_call(1)
49
+ @mock.random_call(2)
50
+ @mock.__verify
51
+
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "a mock" do
6
+ setup do
7
+ @mock = mock("mock", :null_object => true)
8
+ end
9
+ specify "should answer false for received_message? when no messages received" do
10
+ @mock.received_message?(:message).should be(false)
11
+ end
12
+ specify "should answer true for received_message? when message received" do
13
+ @mock.message
14
+ @mock.received_message?(:message).should be(true)
15
+ end
16
+ specify "should answer true for received_message? when message received with correct args" do
17
+ @mock.message 1,2,3
18
+ @mock.received_message?(:message, 1,2,3).should be(true)
19
+ end
20
+ specify "should answer false for received_message? when message received with incorrect args" do
21
+ @mock.message 1,2,3
22
+ @mock.received_message?(:message, 1,2).should be(false)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,159 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ context "A method stub" do
6
+ setup do
7
+ @class = Class.new do
8
+ def self.existing_class_method
9
+ :original_value
10
+ end
11
+
12
+ def existing_instance_method
13
+ :original_value
14
+ end
15
+ end
16
+ @obj = @class.new
17
+ end
18
+
19
+ specify "should allow for a mock expectation to temporarily replace a method stub on a mock" do
20
+ mock = Spec::Mocks::Mock.new("a mock")
21
+ mock.stub!(:msg).and_return(:stub_value)
22
+ mock.should_receive(:msg).with(:arg).and_return(:mock_value)
23
+ mock.msg(:arg).should equal(:mock_value)
24
+ mock.msg.should equal(:stub_value)
25
+ mock.msg.should equal(:stub_value)
26
+ mock.__verify
27
+ end
28
+
29
+ specify "should allow for a mock expectation to temporarily replace a method stub on a non-mock" do
30
+ @obj.stub!(:msg).and_return(:stub_value)
31
+ @obj.should_receive(:msg).with(:arg).and_return(:mock_value)
32
+ @obj.msg(:arg).should equal(:mock_value)
33
+ @obj.msg.should equal(:stub_value)
34
+ @obj.msg.should equal(:stub_value)
35
+ @obj.__verify
36
+ end
37
+
38
+ specify "should ignore when expected message is not received" do
39
+ @obj.stub!(:msg)
40
+ lambda do
41
+ @obj.__verify
42
+ end.should_not_raise
43
+ end
44
+
45
+ specify "should clear itself on __verify" do
46
+ @obj.stub!(:this_should_go).and_return(:blah)
47
+ @obj.this_should_go.should_equal :blah
48
+ @obj.__verify
49
+ lambda do
50
+ @obj.this_should_go
51
+ end.should_raise
52
+ end
53
+
54
+ specify "should ignore when expected message is received" do
55
+ @obj.stub!(:msg)
56
+ @obj.msg
57
+ @obj.__verify
58
+ end
59
+
60
+ specify "should ignore when message is received with args" do
61
+ @obj.stub!(:msg)
62
+ @obj.msg(:an_arg)
63
+ @obj.__verify
64
+ end
65
+
66
+ specify "should not support with" do
67
+ lambda do
68
+ Spec::Mocks::Mock.new("a mock").stub!(:msg).with(:arg)
69
+ end.should_raise(NoMethodError)
70
+ end
71
+
72
+ specify "should return expected value when expected message is received" do
73
+ @obj.stub!(:msg).and_return(:return_value)
74
+ @obj.msg.should equal(:return_value)
75
+ @obj.__verify
76
+ end
77
+
78
+ specify "should return values in order to consecutive calls" do
79
+ return_values = ["1",2,Object.new]
80
+ @obj.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2])
81
+ @obj.msg.should_eql return_values[0]
82
+ @obj.msg.should_eql return_values[1]
83
+ @obj.msg.should_eql return_values[2]
84
+ end
85
+
86
+ specify "should keep returning last value in consecutive calls" do
87
+ return_values = ["1",2,Object.new]
88
+ @obj.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2])
89
+ @obj.msg.should_eql return_values[0]
90
+ @obj.msg.should_eql return_values[1]
91
+ @obj.msg.should_eql return_values[2]
92
+ @obj.msg.should_eql return_values[2]
93
+ @obj.msg.should_eql return_values[2]
94
+ end
95
+
96
+ specify "should revert to original instance method if existed" do
97
+ @obj.existing_instance_method.should equal(:original_value)
98
+ @obj.stub!(:existing_instance_method).and_return(:mock_value)
99
+ @obj.existing_instance_method.should equal(:mock_value)
100
+ @obj.__verify
101
+ # TODO JRUBY: This causes JRuby to fail with:
102
+ # NativeException in 'Stub should revert to original instance method if existed'
103
+ # java.lang.ArrayIndexOutOfBoundsException: 0
104
+ # org.jruby.internal.runtime.methods.IterateCallable.internalCall(IterateCallable.java:63)
105
+ # org.jruby.internal.runtime.methods.AbstractCallable.call(AbstractCallable.java:64)
106
+ # org.jruby.runtime.ThreadContext.yieldInternal(ThreadContext.java:574)
107
+ # org.jruby.runtime.ThreadContext.yieldSpecificBlock(ThreadContext.java:549)
108
+ # org.jruby.runtime.Block.call(Block.java:158)
109
+ # org.jruby.RubyProc.call(RubyProc.java:118)
110
+ # org.jruby.internal.runtime.methods.ProcMethod.internalCall(ProcMethod.java:69)
111
+ # org.jruby.internal.runtime.methods.AbstractMethod.call(AbstractMethod.java:58)
112
+ # org.jruby.RubyObject.callMethod(RubyObject.java:379)
113
+ # org.jruby.RubyObject.callMethod(RubyObject.java:331)
114
+ # org.jruby.evaluator.EvaluationState.evalInternal(EvaluationState.java:472)
115
+ # org.jruby.evaluator.EvaluationState.evalInternal(EvaluationState.java:462)
116
+ # org.jruby.evaluator.EvaluationState.evalInternal(EvaluationState.java:390)
117
+ # org.jruby.evaluator.EvaluationState.eval(EvaluationState.java:133)
118
+ @obj.existing_instance_method.should equal(:original_value)
119
+ end
120
+
121
+ specify "should revert to original class method if existed" do
122
+ @class.existing_class_method.should equal(:original_value)
123
+ @class.stub!(:existing_class_method).and_return(:mock_value)
124
+ @class.existing_class_method.should equal(:mock_value)
125
+ @class.__verify
126
+ @class.existing_class_method.should equal(:original_value)
127
+ end
128
+
129
+ specify "should clear itself on __verify" do
130
+ @obj.stub!(:this_should_go).and_return(:blah)
131
+ @obj.this_should_go.should_equal :blah
132
+ @obj.__verify
133
+ lambda do
134
+ @obj.this_should_go
135
+ end.should_raise
136
+ end
137
+
138
+ specify "should support yielding" do
139
+ @obj.stub!(:method_that_yields).and_yield(:yielded_value)
140
+ current_value = :value_before
141
+ @obj.method_that_yields {|val| current_value = val}
142
+ current_value.should_equal :yielded_value
143
+ @obj.__verify
144
+ end
145
+
146
+ specify "should throw when told to" do
147
+ @mock.stub!(:something).and_throw(:blech)
148
+ lambda do
149
+ @mock.something
150
+ end.should_throw(:blech)
151
+ end
152
+
153
+ specify "should support overriding w/ a new stub" do
154
+ @stub.stub!(:existing_instance_method).and_return(:updated_stub_value)
155
+ @stub.existing_instance_method.should == :updated_stub_value
156
+ end
157
+ end
158
+ end
159
+ end