1 require File.dirname(__FILE__) + '/../../spec_helper.rb'
5 describe "A method stub" do
8 def self.existing_class_method
12 def existing_instance_method
16 @instance = @class.new
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
25 it "should ignore when expected message is received" do
29 @instance.rspec_verify
30 end.should_not raise_error
33 it "should ignore when message is received with args" do
35 @instance.msg(:an_arg)
37 @instance.rspec_verify
38 end.should_not raise_error
41 it "should ignore when expected message is not received" do
44 @instance.rspec_verify
45 end.should_not raise_error
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
53 @instance.this_should_go
54 end.should raise_error(NameError)
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]
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]
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)
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)
88 @class.existing_class_method.should equal(:original_value)
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
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)
103 @instance.method_that_yields_multiple_times {|val| current_value << val}
104 current_value.should == [:yielded_value, :another_value]
105 @instance.rspec_verify
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
115 it "should throw when told to" do
116 @mock.stub!(:something).and_throw(:up)
119 end.should throw_symbol(:up)
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
127 it "should limit " do
128 @stub.stub!(:foo).with("bar")
129 @stub.should_receive(:foo).with("baz")
135 describe "A method stub with args" do
138 @stub.stub!(:foo).with("bar")
141 it "should not complain if not called" do
144 it "should not complain if called with arg" do
148 it "should complain if called with no arg" do
151 end.should raise_error
154 it "should complain if called with other arg" do
157 end.should raise_error
160 it "should not complain if also mocked w/ different args" do
161 @stub.should_receive(:foo).with("baz")
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")
172 end.should raise_error
175 it "should support options" do
176 @stub.stub!(:foo, :expected_from => "bar")