]> git.openstreetmap.org Git - rails.git/blob - vendor/gems/rspec-1.1.2/spec/spec/mocks/stub_spec.rb
d6e23d71e35ce4abbb4432ddc8609b31086601fc
[rails.git] / vendor / gems / rspec-1.1.2 / spec / spec / mocks / stub_spec.rb
1 require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
3 module Spec
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       end
18
19       it "should return expected value when expected message is received" do
20         @instance.stub!(:msg).and_return(:return_value)
21         @instance.msg.should equal(:return_value)
22         @instance.rspec_verify
23       end
24
25       it "should ignore when expected message is received" do
26         @instance.stub!(:msg)
27         @instance.msg
28         lambda do
29           @instance.rspec_verify
30         end.should_not raise_error
31       end
32
33       it "should ignore when message is received with args" do
34         @instance.stub!(:msg)
35         @instance.msg(:an_arg)
36         lambda do
37           @instance.rspec_verify
38         end.should_not raise_error
39       end
40
41       it "should ignore when expected message is not received" do
42         @instance.stub!(:msg)
43         lambda do
44           @instance.rspec_verify
45         end.should_not raise_error
46       end
47       
48       it "should clear itself when verified" do
49         @instance.stub!(:this_should_go).and_return(:blah)
50         @instance.this_should_go.should == :blah
51         @instance.rspec_verify
52         lambda do
53           @instance.this_should_go
54         end.should raise_error(NameError)
55       end
56
57       it "should return values in order to consecutive calls" do
58         return_values = ["1",2,Object.new]
59         @instance.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2])
60         @instance.msg.should == return_values[0]
61         @instance.msg.should == return_values[1]
62         @instance.msg.should == return_values[2]
63       end
64
65       it "should keep returning last value in consecutive calls" do
66         return_values = ["1",2,Object.new]
67         @instance.stub!(:msg).and_return(return_values[0],return_values[1],return_values[2])
68         @instance.msg.should == return_values[0]
69         @instance.msg.should == return_values[1]
70         @instance.msg.should == return_values[2]
71         @instance.msg.should == return_values[2]
72         @instance.msg.should == return_values[2]
73       end
74
75       it "should revert to original instance method if there is one" do
76         @instance.existing_instance_method.should equal(:original_value)
77         @instance.stub!(:existing_instance_method).and_return(:mock_value)
78         @instance.existing_instance_method.should equal(:mock_value)
79         @instance.rspec_verify
80         @instance.existing_instance_method.should equal(:original_value)
81       end
82       
83       it "should revert to original class method if there is one" do
84         @class.existing_class_method.should equal(:original_value)
85         @class.stub!(:existing_class_method).and_return(:mock_value)
86         @class.existing_class_method.should equal(:mock_value)
87         @class.rspec_verify
88         @class.existing_class_method.should equal(:original_value)
89       end
90
91       it "should yield a specified object" do
92         @instance.stub!(:method_that_yields).and_yield(:yielded_obj)
93         current_value = :value_before
94         @instance.method_that_yields {|val| current_value = val}
95         current_value.should == :yielded_obj
96         @instance.rspec_verify
97       end
98
99       it "should yield multiple times with multiple calls to and_yield" do
100         @instance.stub!(:method_that_yields_multiple_times).and_yield(:yielded_value).
101                                                        and_yield(:another_value)
102         current_value = []
103         @instance.method_that_yields_multiple_times {|val| current_value << val}
104         current_value.should == [:yielded_value, :another_value]
105         @instance.rspec_verify
106       end
107       
108       it "should yield a specified object and return another specified object" do
109         yielded_obj = mock("my mock")
110         yielded_obj.should_receive(:foo).with(:bar)
111         @instance.stub!(:method_that_yields_and_returns).and_yield(yielded_obj).and_return(:baz)
112         @instance.method_that_yields_and_returns { |o| o.foo :bar }.should == :baz
113       end
114
115       it "should throw when told to" do
116         @mock.stub!(:something).and_throw(:up)
117         lambda do
118           @mock.something
119         end.should throw_symbol(:up)
120       end
121       
122       it "should override a pre-existing stub" do
123         @stub.stub!(:existing_instance_method).and_return(:updated_stub_value)
124         @stub.existing_instance_method.should == :updated_stub_value
125       end
126       
127       it "should limit " do
128         @stub.stub!(:foo).with("bar")
129         @stub.should_receive(:foo).with("baz")
130         @stub.foo("bar")
131         @stub.foo("baz")
132       end
133     end
134     
135     describe "A method stub with args" do
136       before(:each) do
137         @stub = Object.new
138         @stub.stub!(:foo).with("bar")
139       end
140
141       it "should not complain if not called" do
142       end
143
144       it "should not complain if called with arg" do
145         @stub.foo("bar")
146       end
147
148       it "should complain if called with no arg" do
149         lambda do
150           @stub.foo
151         end.should raise_error
152       end
153
154       it "should complain if called with other arg" do
155         lambda do
156           @stub.foo("other")
157         end.should raise_error
158       end
159
160       it "should not complain if also mocked w/ different args" do
161         @stub.should_receive(:foo).with("baz")
162         @stub.foo("bar")
163         @stub.foo("baz")
164       end
165
166       it "should complain if also mocked w/ different args AND called w/ a 3rd set of args" do
167         @stub.should_receive(:foo).with("baz")
168         @stub.foo("bar")
169         @stub.foo("baz")
170         lambda do
171           @stub.foo("other")
172         end.should raise_error
173       end
174       
175       it "should support options" do
176         @stub.stub!(:foo, :expected_from => "bar")
177       end
178     end
179
180   end
181 end