changelog shortlog tags changeset manifest revisions annotate raw

vendor/plugins/rspec/spec/spec/mocks/stub_spec.rb

changeset 15: 64acf98d15f4
author: moriq@moriq.com
date: Mon Mar 10 10:12:58 2008 +0900 (16 years ago)
permissions: -rw-r--r--
description: add plugins rspec
1require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
3module 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
181end