rspec-mocks 2.11.2 → 2.11.3

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.
@@ -1,3 +1,17 @@
1
+ ### 2.11.3 / 2012-09-19
2
+ [full changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.2...v2.11.3)
3
+
4
+ Bug fixes
5
+
6
+ * Fix `:transfer_nested_constants` option of `stub_const` so that it
7
+ doesn't blow up when there are inherited constants. (Myron Marston)
8
+ * `any_instance` stubs can be used on classes that override `Object#method`.
9
+ (Andy Lindeman)
10
+ * Methods stubbed with `any_instance` are unstubbed after the test finishes.
11
+ (Andy Lindeman)
12
+ * Fix confusing error message when calling a mocked class method an
13
+ extra time with the wrong arguments (Myron Marston).
14
+
1
15
  ### 2.11.2 / 2012-08-11
2
16
  [full changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.1...v2.11.2)
3
17
 
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # RSpec Mocks [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/rspec/rspec-mocks)
1
+ # RSpec Mocks [![Build Status](https://secure.travis-ci.org/rspec/rspec-mocks.png?branch=master)](http://travis-ci.org/rspec/rspec-mocks) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/rspec/rspec-mocks)
2
2
 
3
3
  rspec-mocks is a test-double framework for rspec with support for method stubs,
4
4
  fakes, and message expectations on generated test-doubles and real objects
@@ -175,7 +175,7 @@ module RSpec
175
175
  backup_method!(method_name)
176
176
  @klass.class_eval(<<-EOM, __FILE__, __LINE__)
177
177
  def #{method_name}(*args, &blk)
178
- klass = self.method(:#{method_name}).owner
178
+ klass = ::Object.instance_method(:method).bind(self).call(:#{method_name}).owner
179
179
  klass.__recorder.playback!(self, :#{method_name})
180
180
  self.__send__(:#{method_name}, *args, &blk)
181
181
  end
@@ -187,7 +187,7 @@ module RSpec
187
187
  @klass.class_eval(<<-EOM, __FILE__, __LINE__)
188
188
  def #{method_name}(*args, &blk)
189
189
  method_name = :#{method_name}
190
- klass = self.method(:#{method_name}).owner
190
+ klass = ::Object.instance_method(:method).bind(self).call(:#{method_name}).owner
191
191
  invoked_instance = klass.__recorder.instance_that_received(method_name)
192
192
  raise RSpec::Mocks::MockExpectationError, "The message '#{method_name}' was received by \#{self.inspect} but has already been received by \#{invoked_instance}"
193
193
  end
@@ -3,6 +3,7 @@
3
3
  # object in the system.
4
4
 
5
5
  require 'rspec/mocks/extensions/instance_exec'
6
+ require 'rspec/mocks/stashed_instance_method'
6
7
  require 'rspec/mocks/method_double'
7
8
  require 'rspec/mocks/methods'
8
9
  require 'rspec/mocks/argument_matchers'
@@ -10,7 +10,9 @@ module RSpec
10
10
  @method_name = method_name
11
11
  @object = object
12
12
  @proxy = proxy
13
- @stashed = false
13
+
14
+ @stashed_method = StashedInstanceMethod.new(object_singleton_class, @method_name)
15
+ @method_is_proxied = false
14
16
  store(:expectations, [])
15
17
  store(:stubs, [])
16
18
  end
@@ -43,73 +45,39 @@ module RSpec
43
45
  class << @object; self; end
44
46
  end
45
47
 
46
- # @private
47
- def obfuscate(method_name)
48
- "obfuscated_by_rspec_mocks__#{method_name}"
49
- end
50
-
51
- # @private
52
- def stashed_method_name
53
- obfuscate(method_name)
54
- end
55
-
56
- # @private
57
- def object_responds_to?(method_name)
58
- if @proxy.already_proxied_respond_to?
59
- @object.__send__(obfuscate(:respond_to?), method_name)
60
- elsif method_name == :respond_to?
61
- @proxy.already_proxied_respond_to
62
- else
63
- @object.respond_to?(method_name, true)
64
- end
65
- end
66
-
67
48
  # @private
68
49
  def configure_method
69
50
  RSpec::Mocks::space.add(@object) if RSpec::Mocks::space
70
51
  warn_if_nil_class
71
- unless @stashed
72
- stash_original_method
73
- define_proxy_method
74
- end
75
- end
76
-
77
- # @private
78
- def stash_original_method
79
- stashed = stashed_method_name
80
- orig = @method_name
81
- object_singleton_class.class_eval do
82
- alias_method(stashed, orig) if method_defined?(orig) || private_method_defined?(orig)
83
- end
84
- @stashed = true
52
+ @stashed_method.stash unless @method_is_proxied
53
+ define_proxy_method
85
54
  end
86
55
 
87
56
  # @private
88
57
  def define_proxy_method
89
- method_name = @method_name
90
- visibility_for_method = "#{visibility} :#{method_name}"
91
- object_singleton_class.class_eval(<<-EOF, __FILE__, __LINE__)
92
- def #{method_name}(*args, &block)
93
- __mock_proxy.message_received :#{method_name}, *args, &block
58
+ return if @method_is_proxied
59
+
60
+ object_singleton_class.class_eval <<-EOF, __FILE__, __LINE__ + 1
61
+ def #{@method_name}(*args, &block)
62
+ __mock_proxy.message_received :#{@method_name}, *args, &block
94
63
  end
95
- #{visibility_for_method}
64
+ #{visibility_for_method}
96
65
  EOF
66
+ @method_is_proxied = true
67
+ end
68
+
69
+ # @private
70
+ def visibility_for_method
71
+ "#{visibility} :#{method_name}"
97
72
  end
98
73
 
99
74
  # @private
100
75
  def restore_original_method
101
- if @stashed
102
- method_name = @method_name
103
- stashed_method_name = self.stashed_method_name
104
- object_singleton_class.instance_eval do
105
- remove_method method_name
106
- if method_defined?(stashed_method_name) || private_method_defined?(stashed_method_name)
107
- alias_method method_name, stashed_method_name
108
- remove_method stashed_method_name
109
- end
110
- end
111
- @stashed = false
112
- end
76
+ return unless @method_is_proxied
77
+
78
+ object_singleton_class.__send__(:remove_method, @method_name)
79
+ @stashed_method.restore
80
+ @method_is_proxied = false
113
81
  end
114
82
 
115
83
  # @private
@@ -84,7 +84,7 @@ module RSpec
84
84
  chain.shift
85
85
  matching_stub.invoke.stub_chain(*chain, &blk)
86
86
  else
87
- next_in_chain = Object.new
87
+ next_in_chain = Mock.new
88
88
  stub(chain.shift) { next_in_chain }
89
89
  next_in_chain.stub_chain(*chain, &blk)
90
90
  end
@@ -175,7 +175,11 @@ module RSpec
175
175
  end
176
176
 
177
177
  def find_almost_matching_expectation(method_name, *args)
178
- method_double[method_name].expectations.find {|expectation| expectation.matches_name_but_not_args(method_name, *args) && !expectation.called_max_times?}
178
+ method_double[method_name].expectations.find do |expectation|
179
+ expectation.matches_name_but_not_args(method_name, *args) && !expectation.called_max_times?
180
+ end || method_double[method_name].expectations.find do |expectation|
181
+ expectation.matches_name_but_not_args(method_name, *args)
182
+ end
179
183
  end
180
184
 
181
185
  def find_matching_method_stub(method_name, *args)
@@ -0,0 +1,60 @@
1
+ # @private
2
+ class StashedInstanceMethod
3
+ def initialize(klass, method)
4
+ @klass = klass
5
+ @method = method
6
+
7
+ @method_is_stashed = false
8
+ end
9
+
10
+ # @private
11
+ def stash
12
+ return if !method_defined_directly_on_klass? || @method_is_stashed
13
+
14
+ @klass.__send__(:alias_method, stashed_method_name, @method)
15
+ @method_is_stashed = true
16
+ end
17
+
18
+ private
19
+
20
+ # @private
21
+ def method_defined_directly_on_klass?
22
+ method_defined_on_klass? && method_owned_by_klass?
23
+ end
24
+
25
+ # @private
26
+ def method_defined_on_klass?
27
+ @klass.method_defined?(@method) || @klass.private_method_defined?(@method)
28
+ end
29
+
30
+ if ::UnboundMethod.method_defined?(:owner)
31
+ # @private
32
+ def method_owned_by_klass?
33
+ @klass.instance_method(@method).owner == @klass
34
+ end
35
+ else
36
+ # @private
37
+ def method_owned_by_klass?
38
+ # On 1.8.6, which does not support Method#owner, we have no choice but
39
+ # to assume it's defined on the klass even if it may be defined on
40
+ # a superclass.
41
+ true
42
+ end
43
+ end
44
+
45
+ # @private
46
+ def stashed_method_name
47
+ "obfuscated_by_rspec_mocks__#{@method}"
48
+ end
49
+
50
+ public
51
+
52
+ # @private
53
+ def restore
54
+ return unless @method_is_stashed
55
+
56
+ @klass.__send__(:alias_method, @method, stashed_method_name)
57
+ @klass.__send__(:remove_method, stashed_method_name)
58
+ @method_is_stashed = false
59
+ end
60
+ end
@@ -10,17 +10,22 @@ module RSpec
10
10
  # we need to conditionally define methods to ignore the top-level/inherited
11
11
  # constants.
12
12
  #
13
- # Given `class A; end`:
13
+ # Given:
14
+ # class A; B = 1; end
15
+ # class C < A; end
14
16
  #
15
17
  # On 1.8:
16
- # - A.const_get("Hash") # => ::Hash
17
- # - A.const_defined?("Hash") # => false
18
- # - Neither method accepts the extra `inherit` argument
18
+ # - C.const_get("Hash") # => ::Hash
19
+ # - C.const_defined?("Hash") # => false
20
+ # - C.constants # => ["A"]
21
+ # - None of these methods accept the extra `inherit` argument
19
22
  # On 1.9:
20
- # - A.const_get("Hash") # => ::Hash
21
- # - A.const_defined?("Hash") # => true
22
- # - A.const_get("Hash", false) # => raises NameError
23
- # - A.const_defined?("Hash", false) # => false
23
+ # - C.const_get("Hash") # => ::Hash
24
+ # - C.const_defined?("Hash") # => true
25
+ # - C.const_get("Hash", false) # => raises NameError
26
+ # - C.const_defined?("Hash", false) # => false
27
+ # - C.constants # => [:A]
28
+ # - C.constants(false) #=> []
24
29
  if Module.method(:const_defined?).arity == 1
25
30
  def const_defined_on?(mod, const_name)
26
31
  mod.const_defined?(const_name)
@@ -33,6 +38,10 @@ module RSpec
33
38
 
34
39
  raise NameError, "uninitialized constant #{mod.name}::#{const_name}"
35
40
  end
41
+
42
+ def constants_defined_on(mod)
43
+ mod.constants.select { |c| const_defined_on?(mod, c) }
44
+ end
36
45
  else
37
46
  def const_defined_on?(mod, const_name)
38
47
  mod.const_defined?(const_name, false)
@@ -41,6 +50,10 @@ module RSpec
41
50
  def get_const_defined_on(mod, const_name)
42
51
  mod.const_get(const_name, false)
43
52
  end
53
+
54
+ def constants_defined_on(mod)
55
+ mod.constants(false)
56
+ end
44
57
  end
45
58
 
46
59
  def recursive_const_get(const_name)
@@ -217,10 +230,10 @@ module RSpec
217
230
 
218
231
  if @transfer_nested_constants.is_a?(Array)
219
232
  @transfer_nested_constants = @transfer_nested_constants.map(&:to_s) if RUBY_VERSION == '1.8.7'
220
- undefined_constants = @transfer_nested_constants - @original_value.constants
233
+ undefined_constants = @transfer_nested_constants - constants_defined_on(@original_value)
221
234
 
222
235
  if undefined_constants.any?
223
- available_constants = @original_value.constants - @transfer_nested_constants
236
+ available_constants = constants_defined_on(@original_value) - @transfer_nested_constants
224
237
  raise ArgumentError,
225
238
  "Cannot transfer nested constant(s) #{undefined_constants.join(' and ')} " +
226
239
  "for #{@full_constant_name} since they are not defined. Did you mean " +
@@ -229,7 +242,7 @@ module RSpec
229
242
 
230
243
  @transfer_nested_constants
231
244
  else
232
- @original_value.constants
245
+ constants_defined_on(@original_value)
233
246
  end
234
247
  end
235
248
  end
@@ -1,7 +1,7 @@
1
1
  module RSpec
2
2
  module Mocks
3
3
  module Version
4
- STRING = '2.11.2'
4
+ STRING = '2.11.3'
5
5
  end
6
6
  end
7
7
  end
@@ -845,6 +845,33 @@ module RSpec
845
845
  end.to raise_error(RSpec::Mocks::MockExpectationError, "The message 'existing_method' was received by #{instance_two.inspect} but has already been received by #{instance_one.inspect}")
846
846
  end
847
847
  end
848
+
849
+ context "when a class overrides Object#method" do
850
+ let(:http_request_class) { Struct.new(:method, :uri) }
851
+
852
+ it "stubs the method correctly" do
853
+ http_request_class.any_instance.stub(:existing_method).and_return("foo")
854
+ http_request_class.new.existing_method.should == "foo"
855
+ end
856
+
857
+ it "mocks the method correctly" do
858
+ http_request_class.any_instance.should_receive(:existing_method).and_return("foo")
859
+ http_request_class.new.existing_method.should == "foo"
860
+ end
861
+ end
862
+
863
+ context "when used after the test has finished" do
864
+ it "restores the original behavior of a stubbed method" do
865
+ klass.any_instance.stub(:existing_method).and_return(:stubbed_return_value)
866
+
867
+ instance = klass.new
868
+ instance.existing_method.should == :stubbed_return_value
869
+
870
+ RSpec::Mocks.verify
871
+
872
+ instance.existing_method.should == :existing_method_return_value
873
+ end
874
+ end
848
875
  end
849
876
  end
850
877
  end
@@ -93,6 +93,21 @@ module RSpec
93
93
  %Q|(nil).foobar(any args)\n expected: 1 time\n received: 0 times|
94
94
  )
95
95
  end
96
+
97
+ it "includes the class name in the error when mocking a class method that is called an extra time with the wrong args" do
98
+ klass = Class.new do
99
+ def self.to_s
100
+ "MyClass"
101
+ end
102
+ end
103
+
104
+ klass.should_receive(:bar).with(1)
105
+ klass.bar(1)
106
+
107
+ expect {
108
+ klass.bar(2)
109
+ }.to raise_error(RSpec::Mocks::MockExpectationError, /MyClass/)
110
+ end
96
111
  end
97
112
 
98
113
  describe "Partially mocking an object that defines ==, after another mock has been defined" do
@@ -59,7 +59,7 @@ module RSpec
59
59
  end
60
60
 
61
61
  it 'serializes to yaml the same with and without stubbing, using YAML.dump' do
62
- expect { set_stub }.to_not change { YAML.dump(serializable_object) }
62
+ expect { set_stub }.to_not change { ::YAML.dump(serializable_object) }
63
63
  end
64
64
  end
65
65
 
@@ -73,12 +73,12 @@ module RSpec
73
73
 
74
74
  if compiled_with_psych
75
75
  context 'using Syck as the YAML engine' do
76
- before(:each) { YAML::ENGINE.yamler = 'syck' }
76
+ before(:each) { ::YAML::ENGINE.yamler = 'syck' }
77
77
  it_behaves_like 'normal YAML serialization'
78
78
  end
79
79
 
80
80
  context 'using Psych as the YAML engine' do
81
- before(:each) { YAML::ENGINE.yamler = 'psych' }
81
+ before(:each) { ::YAML::ENGINE.yamler = 'psych' }
82
82
  it_behaves_like 'normal YAML serialization'
83
83
  end
84
84
  else
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe StashedInstanceMethod do
4
+ class ExampleClass
5
+ def hello
6
+ :hello_defined_on_class
7
+ end
8
+ end
9
+
10
+ def singleton_class_for(obj)
11
+ class << obj; self; end
12
+ end
13
+
14
+ it "stashes the current implementation of an instance method so it can be temporarily replaced" do
15
+ obj = Object.new
16
+ def obj.hello; :hello_defined_on_singleton_class; end;
17
+
18
+ stashed_method = StashedInstanceMethod.new(singleton_class_for(obj), :hello)
19
+ stashed_method.stash
20
+
21
+ def obj.hello; :overridden_hello; end
22
+ expect(obj.hello).to eql :overridden_hello
23
+
24
+ stashed_method.restore
25
+ expect(obj.hello).to eql :hello_defined_on_singleton_class
26
+ end
27
+
28
+ it "stashes private instance methods" do
29
+ obj = Object.new
30
+ def obj.hello; :hello_defined_on_singleton_class; end;
31
+ singleton_class_for(obj).__send__(:private, :hello)
32
+
33
+ stashed_method = StashedInstanceMethod.new(singleton_class_for(obj), :hello)
34
+ stashed_method.stash
35
+
36
+ def obj.hello; :overridden_hello; end
37
+ stashed_method.restore
38
+ expect(obj.send(:hello)).to eql :hello_defined_on_singleton_class
39
+ end
40
+
41
+ it "only stashes methods directly defined on the given class, not its ancestors" do
42
+ obj = ExampleClass.new
43
+
44
+ stashed_method = StashedInstanceMethod.new(singleton_class_for(obj), :hello)
45
+ stashed_method.stash
46
+
47
+ def obj.hello; :overridden_hello; end;
48
+ expect(obj.hello).to eql :overridden_hello
49
+
50
+ stashed_method.restore
51
+ expect(obj.hello).to eql :overridden_hello
52
+ end
53
+ end
@@ -144,6 +144,11 @@ module RSpec
144
144
  object.msg1.msg2.msg3.msg4.should equal(:first)
145
145
  object.msg1.msg2.msg3.msg5.should equal(:second)
146
146
  end
147
+
148
+ it "handles private instance methods (like Object#select) in the middle of a chain" do
149
+ object.stub_chain(:msg1, :select, :msg3 => 'answer')
150
+ expect(object.msg1.select.msg3).to eq 'answer'
151
+ end
147
152
  end
148
153
  end
149
154
  end
@@ -12,6 +12,10 @@ class TestClass
12
12
  end
13
13
  end
14
14
 
15
+ class TestSubClass < TestClass
16
+ P = :p
17
+ end
18
+
15
19
  module RSpec
16
20
  module Mocks
17
21
  describe "Constant Stubbing" do
@@ -121,6 +125,24 @@ module RSpec
121
125
  stub::Nested.should be(tc_nested)
122
126
  end
123
127
 
128
+ it 'does not transfer nested constants that are inherited from a superclass' do
129
+ stub = Module.new
130
+ stub_const("TestSubClass", stub, :transfer_nested_constants => true)
131
+ stub::P.should eq(:p)
132
+ defined?(stub::M).should be_false
133
+ defined?(stub::N).should be_false
134
+ end
135
+
136
+ it 'raises an error when asked to transfer a nested inherited constant' do
137
+ original_tsc = TestSubClass
138
+
139
+ expect {
140
+ stub_const("TestSubClass", Module.new, :transfer_nested_constants => [:M])
141
+ }.to raise_error(ArgumentError)
142
+
143
+ TestSubClass.should be(original_tsc)
144
+ end
145
+
124
146
  it 'allows nested constants to be selectively transferred to a stub module' do
125
147
  stub = Module.new
126
148
  stub_const("TestClass", stub, :transfer_nested_constants => [:M, :N])
@@ -56,6 +56,19 @@ module RSpec
56
56
  obj.unstub(:foo)
57
57
  obj.foo(3).should eq :three
58
58
  end
59
+
60
+ it "restores the correct implementations when stubbed and unstubbed on a parent and child class" do
61
+ parent = Class.new
62
+ child = Class.new(parent)
63
+
64
+ parent.stub(:new)
65
+ child.stub(:new)
66
+ parent.unstub(:new)
67
+ child.unstub(:new)
68
+
69
+ parent.new.should be_an_instance_of parent
70
+ child.new.should be_an_instance_of child
71
+ end
59
72
 
60
73
  it "raises a MockExpectationError if the method has not been stubbed" do
61
74
  obj = Object.new
@@ -112,6 +112,15 @@ module RSpec
112
112
  @class.rspec_reset
113
113
  @class.send(:existing_private_class_method).should eq(:original_value)
114
114
  end
115
+
116
+ it "does not remove existing methods that have been stubbed twice" do
117
+ @instance.stub(:existing_instance_method)
118
+ @instance.stub(:existing_instance_method)
119
+
120
+ @instance.rspec_reset
121
+
122
+ @instance.existing_instance_method.should eq(:original_value)
123
+ end
115
124
  end
116
125
 
117
126
  it "returns values in order to consecutive calls" do
@@ -1,3 +1,9 @@
1
+ require 'yaml'
2
+ begin
3
+ require 'psych'
4
+ rescue LoadError
5
+ end
6
+
1
7
  RSpec::Matchers.define :include_method do |expected|
2
8
  match do |actual|
3
9
  actual.map { |m| m.to_s }.include?(expected.to_s)
metadata CHANGED
@@ -1,71 +1,80 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rspec-mocks
3
- version: !ruby/object:Gem::Version
4
- version: 2.11.2
3
+ version: !ruby/object:Gem::Version
4
+ hash: 37
5
5
  prerelease:
6
+ segments:
7
+ - 2
8
+ - 11
9
+ - 3
10
+ version: 2.11.3
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Steven Baker
9
14
  - David Chelimsky
10
15
  autorequire:
11
16
  bindir: bin
12
17
  cert_chain: []
13
- date: 2012-08-12 00:00:00.000000000 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
18
+
19
+ date: 2012-09-20 00:00:00 Z
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
16
22
  name: rake
17
- requirement: !ruby/object:Gem::Requirement
18
- none: false
19
- requirements:
20
- - - ~>
21
- - !ruby/object:Gem::Version
22
- version: 0.9.2
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
26
  none: false
27
- requirements:
27
+ requirements:
28
28
  - - ~>
29
- - !ruby/object:Gem::Version
29
+ - !ruby/object:Gem::Version
30
+ hash: 63
31
+ segments:
32
+ - 0
33
+ - 9
34
+ - 2
30
35
  version: 0.9.2
31
- - !ruby/object:Gem::Dependency
36
+ requirement: *id001
37
+ - !ruby/object:Gem::Dependency
32
38
  name: cucumber
33
- requirement: !ruby/object:Gem::Requirement
34
- none: false
35
- requirements:
36
- - - ~>
37
- - !ruby/object:Gem::Version
38
- version: 1.1.9
39
39
  type: :development
40
40
  prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
41
+ version_requirements: &id002 !ruby/object:Gem::Requirement
42
42
  none: false
43
- requirements:
43
+ requirements:
44
44
  - - ~>
45
- - !ruby/object:Gem::Version
45
+ - !ruby/object:Gem::Version
46
+ hash: 1
47
+ segments:
48
+ - 1
49
+ - 1
50
+ - 9
46
51
  version: 1.1.9
47
- - !ruby/object:Gem::Dependency
52
+ requirement: *id002
53
+ - !ruby/object:Gem::Dependency
48
54
  name: aruba
49
- requirement: !ruby/object:Gem::Requirement
50
- none: false
51
- requirements:
52
- - - ~>
53
- - !ruby/object:Gem::Version
54
- version: 0.4.11
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
57
+ version_requirements: &id003 !ruby/object:Gem::Requirement
58
58
  none: false
59
- requirements:
59
+ requirements:
60
60
  - - ~>
61
- - !ruby/object:Gem::Version
61
+ - !ruby/object:Gem::Version
62
+ hash: 25
63
+ segments:
64
+ - 0
65
+ - 4
66
+ - 11
62
67
  version: 0.4.11
68
+ requirement: *id003
63
69
  description: RSpec's 'test double' framework, with support for stubbing and mocking
64
70
  email: rspec-users@rubyforge.org
65
71
  executables: []
72
+
66
73
  extensions: []
74
+
67
75
  extra_rdoc_files: []
68
- files:
76
+
77
+ files:
69
78
  - lib/rspec/mocks.rb
70
79
  - lib/rspec/mocks/any_instance.rb
71
80
  - lib/rspec/mocks/any_instance/chain.rb
@@ -92,6 +101,7 @@ files:
92
101
  - lib/rspec/mocks/serialization.rb
93
102
  - lib/rspec/mocks/space.rb
94
103
  - lib/rspec/mocks/standalone.rb
104
+ - lib/rspec/mocks/stashed_instance_method.rb
95
105
  - lib/rspec/mocks/stub_const.rb
96
106
  - lib/rspec/mocks/test_double.rb
97
107
  - lib/rspec/mocks/version.rb
@@ -164,6 +174,7 @@ files:
164
174
  - spec/rspec/mocks/record_messages_spec.rb
165
175
  - spec/rspec/mocks/serialization_spec.rb
166
176
  - spec/rspec/mocks/stash_spec.rb
177
+ - spec/rspec/mocks/stashed_instance_method_spec.rb
167
178
  - spec/rspec/mocks/stub_chain_spec.rb
168
179
  - spec/rspec/mocks/stub_const_spec.rb
169
180
  - spec/rspec/mocks/stub_implementation_spec.rb
@@ -175,38 +186,39 @@ files:
175
186
  - spec/rspec/mocks_spec.rb
176
187
  - spec/spec_helper.rb
177
188
  homepage: http://github.com/rspec/rspec-mocks
178
- licenses:
189
+ licenses:
179
190
  - MIT
180
191
  post_install_message:
181
- rdoc_options:
192
+ rdoc_options:
182
193
  - --charset=UTF-8
183
- require_paths:
194
+ require_paths:
184
195
  - lib
185
- required_ruby_version: !ruby/object:Gem::Requirement
196
+ required_ruby_version: !ruby/object:Gem::Requirement
186
197
  none: false
187
- requirements:
188
- - - ! '>='
189
- - !ruby/object:Gem::Version
190
- version: '0'
191
- segments:
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ hash: 3
202
+ segments:
192
203
  - 0
193
- hash: -769108312098701241
194
- required_rubygems_version: !ruby/object:Gem::Requirement
204
+ version: "0"
205
+ required_rubygems_version: !ruby/object:Gem::Requirement
195
206
  none: false
196
- requirements:
197
- - - ! '>='
198
- - !ruby/object:Gem::Version
199
- version: '0'
200
- segments:
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ hash: 3
211
+ segments:
201
212
  - 0
202
- hash: -769108312098701241
213
+ version: "0"
203
214
  requirements: []
215
+
204
216
  rubyforge_project: rspec
205
- rubygems_version: 1.8.24
217
+ rubygems_version: 1.8.6
206
218
  signing_key:
207
219
  specification_version: 3
208
- summary: rspec-mocks-2.11.2
209
- test_files:
220
+ summary: rspec-mocks-2.11.3
221
+ test_files:
210
222
  - features/README.md
211
223
  - features/Scope.md
212
224
  - features/Upgrade.md
@@ -270,6 +282,7 @@ test_files:
270
282
  - spec/rspec/mocks/record_messages_spec.rb
271
283
  - spec/rspec/mocks/serialization_spec.rb
272
284
  - spec/rspec/mocks/stash_spec.rb
285
+ - spec/rspec/mocks/stashed_instance_method_spec.rb
273
286
  - spec/rspec/mocks/stub_chain_spec.rb
274
287
  - spec/rspec/mocks/stub_const_spec.rb
275
288
  - spec/rspec/mocks/stub_implementation_spec.rb