rspec-mocks 2.0.0.a1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. data/.document +5 -0
  2. data/.gitignore +6 -0
  3. data/License.txt +22 -0
  4. data/README.markdown +8 -0
  5. data/Rakefile +50 -0
  6. data/VERSION +1 -0
  7. data/VERSION.yml +5 -0
  8. data/lib/rspec/mocks.rb +201 -0
  9. data/lib/rspec/mocks/argument_expectation.rb +51 -0
  10. data/lib/rspec/mocks/argument_matchers.rb +233 -0
  11. data/lib/rspec/mocks/error_generator.rb +81 -0
  12. data/lib/rspec/mocks/errors.rb +10 -0
  13. data/lib/rspec/mocks/extensions.rb +1 -0
  14. data/lib/rspec/mocks/extensions/object.rb +3 -0
  15. data/lib/rspec/mocks/framework.rb +15 -0
  16. data/lib/rspec/mocks/message_expectation.rb +326 -0
  17. data/lib/rspec/mocks/methods.rb +63 -0
  18. data/lib/rspec/mocks/mock.rb +65 -0
  19. data/lib/rspec/mocks/order_group.rb +29 -0
  20. data/lib/rspec/mocks/proxy.rb +230 -0
  21. data/lib/rspec/mocks/space.rb +28 -0
  22. data/lib/rspec/mocks/spec_methods.rb +39 -0
  23. data/lib/spec/mocks.rb +1 -0
  24. data/spec/rspec/mocks/any_number_of_times_spec.rb +36 -0
  25. data/spec/rspec/mocks/argument_expectation_spec.rb +23 -0
  26. data/spec/rspec/mocks/at_least_spec.rb +97 -0
  27. data/spec/rspec/mocks/at_most_spec.rb +93 -0
  28. data/spec/rspec/mocks/bug_report_10260_spec.rb +8 -0
  29. data/spec/rspec/mocks/bug_report_10263_spec.rb +27 -0
  30. data/spec/rspec/mocks/bug_report_11545_spec.rb +32 -0
  31. data/spec/rspec/mocks/bug_report_15719_spec.rb +29 -0
  32. data/spec/rspec/mocks/bug_report_496_spec.rb +17 -0
  33. data/spec/rspec/mocks/bug_report_600_spec.rb +22 -0
  34. data/spec/rspec/mocks/bug_report_7611_spec.rb +19 -0
  35. data/spec/rspec/mocks/bug_report_7805_spec.rb +22 -0
  36. data/spec/rspec/mocks/bug_report_8165_spec.rb +31 -0
  37. data/spec/rspec/mocks/bug_report_8302_spec.rb +26 -0
  38. data/spec/rspec/mocks/bug_report_830_spec.rb +21 -0
  39. data/spec/rspec/mocks/failing_argument_matchers_spec.rb +95 -0
  40. data/spec/rspec/mocks/hash_including_matcher_spec.rb +90 -0
  41. data/spec/rspec/mocks/hash_not_including_matcher_spec.rb +67 -0
  42. data/spec/rspec/mocks/mock_ordering_spec.rb +94 -0
  43. data/spec/rspec/mocks/mock_space_spec.rb +54 -0
  44. data/spec/rspec/mocks/mock_spec.rb +583 -0
  45. data/spec/rspec/mocks/multiple_return_value_spec.rb +113 -0
  46. data/spec/rspec/mocks/nil_expectation_warning_spec.rb +63 -0
  47. data/spec/rspec/mocks/null_object_mock_spec.rb +54 -0
  48. data/spec/rspec/mocks/once_counts_spec.rb +53 -0
  49. data/spec/rspec/mocks/options_hash_spec.rb +35 -0
  50. data/spec/rspec/mocks/partial_mock_spec.rb +164 -0
  51. data/spec/rspec/mocks/partial_mock_using_mocks_directly_spec.rb +66 -0
  52. data/spec/rspec/mocks/passing_argument_matchers_spec.rb +145 -0
  53. data/spec/rspec/mocks/precise_counts_spec.rb +52 -0
  54. data/spec/rspec/mocks/record_messages_spec.rb +26 -0
  55. data/spec/rspec/mocks/stub_chain_spec.rb +34 -0
  56. data/spec/rspec/mocks/stub_implementation_spec.rb +31 -0
  57. data/spec/rspec/mocks/stub_spec.rb +198 -0
  58. data/spec/rspec/mocks/stubbed_message_expectations_spec.rb +26 -0
  59. data/spec/rspec/mocks/twice_counts_spec.rb +67 -0
  60. data/spec/spec_helper.rb +52 -0
  61. data/spec/support/macros.rb +29 -0
  62. metadata +172 -0
@@ -0,0 +1,66 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Rspec
4
+ module Mocks
5
+ describe "PartialMockUsingMocksDirectly" do
6
+ before(:each) 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
+
18
+ # See http://rubyforge.org/tracker/index.php?func=detail&aid=10263&group_id=797&atid=3149
19
+ # specify "should clear expectations on verify" do
20
+ # @obj.should_receive(:msg)
21
+ # @obj.msg
22
+ # @obj.rspec_verify
23
+ # lambda do
24
+ # @obj.msg
25
+ # end.should raise_error(NoMethodError)
26
+ #
27
+ # end
28
+ it "should fail when expected message is not received" do
29
+ @obj.should_receive(:msg)
30
+ lambda do
31
+ @obj.rspec_verify
32
+ end.should raise_error(MockExpectationError)
33
+
34
+ end
35
+ it "should fail when message is received with incorrect args" do
36
+ @obj.should_receive(:msg).with(:correct_arg)
37
+ lambda do
38
+ @obj.msg(:incorrect_arg)
39
+ end.should raise_error(MockExpectationError)
40
+ @obj.msg(:correct_arg)
41
+
42
+ end
43
+ it "should pass when expected message is received" do
44
+ @obj.should_receive(:msg)
45
+ @obj.msg
46
+ @obj.rspec_verify
47
+
48
+ end
49
+ it "should pass when message is received with correct args" do
50
+ @obj.should_receive(:msg).with(:correct_arg)
51
+ @obj.msg(:correct_arg)
52
+ @obj.rspec_verify
53
+
54
+ end
55
+ it "should revert to original method if existed" do
56
+ @obj.existing_method.should equal(:original_value)
57
+ @obj.should_receive(:existing_method).and_return(:mock_value)
58
+ @obj.existing_method.should equal(:mock_value)
59
+ @obj.rspec_verify
60
+ @obj.existing_method.should equal(:original_value)
61
+
62
+ end
63
+
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,145 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ def include_mock_argument_matchers
4
+ before(:each) do
5
+ @mock = Rspec::Mocks::Mock.new("test mock")
6
+ Kernel.stub!(:warn)
7
+ end
8
+
9
+ after(:each) do
10
+ @mock.rspec_verify
11
+ end
12
+ end
13
+ module Rspec
14
+ module Mocks
15
+
16
+ describe Methods, "handling argument matchers" do
17
+ include_mock_argument_matchers
18
+
19
+ it "should accept true as boolean()" do
20
+ @mock.should_receive(:random_call).with(boolean())
21
+ @mock.random_call(true)
22
+ end
23
+
24
+ it "should accept false as boolean()" do
25
+ @mock.should_receive(:random_call).with(boolean())
26
+ @mock.random_call(false)
27
+ end
28
+
29
+ it "should accept fixnum as kind_of(Numeric)" do
30
+ @mock.should_receive(:random_call).with(kind_of(Numeric))
31
+ @mock.random_call(1)
32
+ end
33
+
34
+ it "should accept float as an_instance_of(Numeric)" do
35
+ @mock.should_receive(:random_call).with(kind_of(Numeric))
36
+ @mock.random_call(1.5)
37
+ end
38
+
39
+ it "accepts fixnum as instance_of(Fixnum)" do
40
+ @mock.should_receive(:random_call).with(instance_of(Fixnum))
41
+ @mock.random_call(1)
42
+ end
43
+
44
+ it "should NOT accept fixnum as instance_of(Numeric)" do
45
+ @mock.should_not_receive(:random_call).with(instance_of(Numeric))
46
+ @mock.random_call(1)
47
+ end
48
+
49
+ it "should NOT accept float as instance_of(Numeric)" do
50
+ @mock.should_not_receive(:random_call).with(instance_of(Numeric))
51
+ @mock.random_call(1.5)
52
+ end
53
+
54
+ it "should accept string as anything()" do
55
+ @mock.should_receive(:random_call).with("a", anything(), "c")
56
+ @mock.random_call("a", "whatever", "c")
57
+ end
58
+
59
+ it "should match duck type with one method" do
60
+ @mock.should_receive(:random_call).with(duck_type(:length))
61
+ @mock.random_call([])
62
+ end
63
+
64
+ it "should match duck type with two methods" do
65
+ @mock.should_receive(:random_call).with(duck_type(:abs, :div))
66
+ @mock.random_call(1)
67
+ end
68
+
69
+ it "should match no args against any_args()" do
70
+ @mock.should_receive(:random_call).with(any_args)
71
+ @mock.random_call()
72
+ end
73
+
74
+ it "should match one arg against any_args()" do
75
+ @mock.should_receive(:random_call).with(any_args)
76
+ @mock.random_call("a string")
77
+ end
78
+
79
+ it "should match no args against no_args()" do
80
+ @mock.should_receive(:random_call).with(no_args)
81
+ @mock.random_call()
82
+ end
83
+
84
+ it "should match hash with hash_including same hash" do
85
+ @mock.should_receive(:random_call).with(hash_including(:a => 1))
86
+ @mock.random_call(:a => 1)
87
+ end
88
+
89
+ end
90
+
91
+ describe Methods, "handling block matchers" do
92
+ include_mock_argument_matchers
93
+
94
+ it "should match arguments against RSpec expectations" do
95
+ @mock.should_receive(:random_call).with {|arg1, arg2, arr, *rest|
96
+ arg1.should == 5
97
+ arg2.should have_at_least(3).characters
98
+ arg2.should have_at_most(10).characters
99
+ arr.map {|i| i * 2}.should == [2,4,6]
100
+ rest.should == [:fee, "fi", 4]
101
+ }
102
+ @mock.random_call 5, "hello", [1,2,3], :fee, "fi", 4
103
+ end
104
+ end
105
+
106
+ describe Methods, "handling non-matcher arguments" do
107
+
108
+ before(:each) do
109
+ @mock = Mock.new("test mock")
110
+ end
111
+
112
+ it "should match non special symbol (can be removed when deprecated symbols are removed)" do
113
+ @mock.should_receive(:random_call).with(:some_symbol)
114
+ @mock.random_call(:some_symbol)
115
+ end
116
+
117
+ it "should match string against regexp" do
118
+ @mock.should_receive(:random_call).with(/bcd/)
119
+ @mock.random_call("abcde")
120
+ end
121
+
122
+ it "should match regexp against regexp" do
123
+ @mock.should_receive(:random_call).with(/bcd/)
124
+ @mock.random_call(/bcd/)
125
+ end
126
+
127
+ it "should match against a hash submitted and received by value" do
128
+ @mock.should_receive(:random_call).with(:a => "a", :b => "b")
129
+ @mock.random_call(:a => "a", :b => "b")
130
+ end
131
+
132
+ it "should match against a hash submitted by reference and received by value" do
133
+ opts = {:a => "a", :b => "b"}
134
+ @mock.should_receive(:random_call).with(opts)
135
+ @mock.random_call(:a => "a", :b => "b")
136
+ end
137
+
138
+ it "should match against a hash submitted by value and received by reference" do
139
+ opts = {:a => "a", :b => "b"}
140
+ @mock.should_receive(:random_call).with(:a => "a", :b => "b")
141
+ @mock.random_call(opts)
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Rspec
4
+ module Mocks
5
+ describe "PreciseCounts" do
6
+ before(:each) do
7
+ @mock = mock("test mock")
8
+ end
9
+
10
+ it "should fail when exactly n times method is called less than n times" do
11
+ @mock.should_receive(:random_call).exactly(3).times
12
+ @mock.random_call
13
+ @mock.random_call
14
+ lambda do
15
+ @mock.rspec_verify
16
+ end.should raise_error(MockExpectationError)
17
+ end
18
+
19
+ it "should fail when exactly n times method is never called" do
20
+ @mock.should_receive(:random_call).exactly(3).times
21
+ lambda do
22
+ @mock.rspec_verify
23
+ end.should raise_error(MockExpectationError)
24
+ end
25
+
26
+ it "should pass if exactly n times method is called exactly n times" do
27
+ @mock.should_receive(:random_call).exactly(3).times
28
+ @mock.random_call
29
+ @mock.random_call
30
+ @mock.random_call
31
+ @mock.rspec_verify
32
+ end
33
+
34
+ it "should pass multiple calls with different args and counts" do
35
+ @mock.should_receive(:random_call).twice.with(1)
36
+ @mock.should_receive(:random_call).once.with(2)
37
+ @mock.random_call(1)
38
+ @mock.random_call(2)
39
+ @mock.random_call(1)
40
+ @mock.rspec_verify
41
+ end
42
+
43
+ it "should pass mutiple calls with different args" do
44
+ @mock.should_receive(:random_call).once.with(1)
45
+ @mock.should_receive(:random_call).once.with(2)
46
+ @mock.random_call(1)
47
+ @mock.random_call(2)
48
+ @mock.rspec_verify
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Rspec
4
+ module Mocks
5
+ describe "a mock" do
6
+ before(:each) do
7
+ @mock = mock("mock", :null_object => true)
8
+ end
9
+ it "should answer false for received_message? when no messages received" do
10
+ @mock.received_message?(:message).should be_false
11
+ end
12
+ it "should answer true for received_message? when message received" do
13
+ @mock.message
14
+ @mock.received_message?(:message).should be_true
15
+ end
16
+ it "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
+ it "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,34 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Rspec
4
+ module Mocks
5
+ describe "A chained method stub" do
6
+ before(:each) do
7
+ @subject = Object.new
8
+ end
9
+
10
+ it "returns expected value from chaining only one method call" do
11
+ @subject.stub_chain(:msg1).and_return(:return_value)
12
+ @subject.msg1.should equal(:return_value)
13
+ end
14
+
15
+ it "returns expected value from chaining two method calls" do
16
+ @subject.stub_chain(:msg1, :msg2).and_return(:return_value)
17
+ @subject.msg1.msg2.should equal(:return_value)
18
+ end
19
+
20
+ it "returns expected value from chaining four method calls" do
21
+ @subject.stub_chain(:msg1, :msg2, :msg3, :msg4).and_return(:return_value)
22
+ @subject.msg1.msg2.msg3.msg4.should equal(:return_value)
23
+ end
24
+
25
+ it "returns expected value from chaining four method calls twice with some shared" do
26
+ @subject.stub_chain(:msg1, :msg2, :msg3, :msg4).and_return(:first)
27
+ @subject.stub_chain(:msg5, :msg2, :msg3, :msg4).and_return(:second)
28
+
29
+ @subject.msg1.msg2.msg3.msg4.should equal(:first)
30
+ @subject.msg5.msg2.msg3.msg4.should equal(:second)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Rspec
4
+ module Mocks
5
+ describe "stub implementation" do
6
+ describe "with no args" do
7
+ it "execs the block when called" do
8
+ obj = stub()
9
+ obj.stub(:foo) { :bar }
10
+ obj.foo.should == :bar
11
+ end
12
+ end
13
+
14
+ describe "with one arg" do
15
+ it "execs the block with that arg when called" do
16
+ obj = stub()
17
+ obj.stub(:foo) {|given| given}
18
+ obj.foo(:bar).should == :bar
19
+ end
20
+ end
21
+
22
+ describe "with variable args" do
23
+ it "execs the block when called" do
24
+ obj = stub()
25
+ obj.stub(:foo) {|*given| given.first}
26
+ obj.foo(:bar).should == :bar
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,198 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Rspec
4
+ module Mocks
5
+ describe "A method stub" do
6
+ before(:each) 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
+ @instance = @class.new
17
+ @stub = Object.new
18
+ end
19
+
20
+ [:stub!, :stub].each do |method|
21
+ describe "using #{method}" do
22
+ it "should return expected value when expected message is received" do
23
+ @instance.send(method, :msg).and_return(:return_value)
24
+ @instance.msg.should equal(:return_value)
25
+ @instance.rspec_verify
26
+ end
27
+ end
28
+ end
29
+
30
+ it "should ignore when expected message is received" do
31
+ @instance.stub!(:msg)
32
+ @instance.msg
33
+ lambda do
34
+ @instance.rspec_verify
35
+ end.should_not raise_error
36
+ end
37
+
38
+ it "should ignore when message is received with args" do
39
+ @instance.stub!(:msg)
40
+ @instance.msg(:an_arg)
41
+ lambda do
42
+ @instance.rspec_verify
43
+ end.should_not raise_error
44
+ end
45
+
46
+ it "should ignore when expected message is not received" do
47
+ @instance.stub!(:msg)
48
+ lambda do
49
+ @instance.rspec_verify
50
+ end.should_not raise_error
51
+ end
52
+
53
+ it "should handle multiple stubbed methods" do
54
+ @instance.stub!(:msg1 => 1, :msg2 => 2)
55
+ @instance.msg1.should == 1
56
+ @instance.msg2.should == 2
57
+ end
58
+
59
+ it "should clear itself when verified" do
60
+ @instance.stub!(:this_should_go).and_return(:blah)
61
+ @instance.this_should_go.should == :blah
62
+ @instance.rspec_verify
63
+ lambda do
64
+ @instance.this_should_go
65
+ end.should raise_error(NameError)
66
+ end
67
+
68
+ it "should return values in order to consecutive calls" do
69
+ return_values = ["1",2,Object.new]
70
+ @instance.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2])
71
+ @instance.msg.should == return_values[0]
72
+ @instance.msg.should == return_values[1]
73
+ @instance.msg.should == return_values[2]
74
+ end
75
+
76
+ it "should keep returning last value in consecutive calls" do
77
+ return_values = ["1",2,Object.new]
78
+ @instance.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2])
79
+ @instance.msg.should == return_values[0]
80
+ @instance.msg.should == return_values[1]
81
+ @instance.msg.should == return_values[2]
82
+ @instance.msg.should == return_values[2]
83
+ @instance.msg.should == return_values[2]
84
+ end
85
+
86
+ it "should revert to original instance method if there is one" do
87
+ @instance.existing_instance_method.should equal(:original_value)
88
+ @instance.stub!(:existing_instance_method).and_return(:mock_value)
89
+ @instance.existing_instance_method.should equal(:mock_value)
90
+ @instance.rspec_verify
91
+ @instance.existing_instance_method.should equal(:original_value)
92
+ end
93
+
94
+ it "should revert to original class method if there is one" do
95
+ @class.existing_class_method.should equal(:original_value)
96
+ @class.stub!(:existing_class_method).and_return(:mock_value)
97
+ @class.existing_class_method.should equal(:mock_value)
98
+ @class.rspec_verify
99
+ @class.existing_class_method.should equal(:original_value)
100
+ end
101
+
102
+ it "should yield a specified object" do
103
+ @instance.stub!(:method_that_yields).and_yield(:yielded_obj)
104
+ current_value = :value_before
105
+ @instance.method_that_yields {|val| current_value = val}
106
+ current_value.should == :yielded_obj
107
+ @instance.rspec_verify
108
+ end
109
+
110
+ it "should yield multiple times with multiple calls to and_yield" do
111
+ @instance.stub!(:method_that_yields_multiple_times).and_yield(:yielded_value).
112
+ and_yield(:another_value)
113
+ current_value = []
114
+ @instance.method_that_yields_multiple_times {|val| current_value << val}
115
+ current_value.should == [:yielded_value, :another_value]
116
+ @instance.rspec_verify
117
+ end
118
+
119
+ it "should yield a specified object and return another specified object" do
120
+ yielded_obj = mock("my mock")
121
+ yielded_obj.should_receive(:foo).with(:bar)
122
+ @instance.stub!(:method_that_yields_and_returns).and_yield(yielded_obj).and_return(:baz)
123
+ @instance.method_that_yields_and_returns { |o| o.foo :bar }.should == :baz
124
+ end
125
+
126
+ it "should throw when told to" do
127
+ @mock.stub!(:something).and_throw(:up)
128
+ lambda do
129
+ @mock.something
130
+ end.should throw_symbol(:up)
131
+ end
132
+
133
+ it "should override a pre-existing stub" do
134
+ @stub.stub!(:existing_instance_method).and_return(:updated_stub_value)
135
+ @stub.existing_instance_method.should == :updated_stub_value
136
+ end
137
+
138
+ it "should limit " do
139
+ @stub.stub!(:foo).with("bar")
140
+ @stub.should_receive(:foo).with("baz")
141
+ @stub.foo("bar")
142
+ @stub.foo("baz")
143
+ end
144
+
145
+ it "calculates return value by executing block passed to #and_return" do
146
+ @mock.stub!(:something).with("a","b","c").and_return { |a,b,c| c+b+a }
147
+ @mock.something("a","b","c").should == "cba"
148
+ @mock.rspec_verify
149
+ end
150
+ end
151
+
152
+ describe "A method stub with args" do
153
+ before(:each) do
154
+ @stub = Object.new
155
+ @stub.stub!(:foo).with("bar")
156
+ end
157
+
158
+ it "should not complain if not called" do
159
+ end
160
+
161
+ it "should not complain if called with arg" do
162
+ @stub.foo("bar")
163
+ end
164
+
165
+ it "should complain if called with no arg" do
166
+ lambda do
167
+ @stub.foo
168
+ end.should raise_error
169
+ end
170
+
171
+ it "should complain if called with other arg" do
172
+ lambda do
173
+ @stub.foo("other")
174
+ end.should raise_error
175
+ end
176
+
177
+ it "should not complain if also mocked w/ different args" do
178
+ @stub.should_receive(:foo).with("baz")
179
+ @stub.foo("bar")
180
+ @stub.foo("baz")
181
+ end
182
+
183
+ it "should complain if also mocked w/ different args AND called w/ a 3rd set of args" do
184
+ @stub.should_receive(:foo).with("baz")
185
+ @stub.foo("bar")
186
+ @stub.foo("baz")
187
+ lambda do
188
+ @stub.foo("other")
189
+ end.should raise_error
190
+ end
191
+
192
+ it "should support options" do
193
+ @stub.stub!(:foo, :expected_from => "bar")
194
+ end
195
+ end
196
+
197
+ end
198
+ end