Skip to content
This repository
  • 18 commits
  • 17 files changed
  • 0 comments
  • 3 contributors
7  Gemfile
... ...
@@ -1,15 +1,16 @@
1 1
 source "http://rubygems.org"
2 2
 
3 3
 gem "rake"
4  
-gem "jeweler"
5 4
 gem "cucumber"
6 5
 gem "aruba", ">= 0.2.0"
7 6
 gem "autotest"
8 7
 gem "rspec-mocks", :path => "."
9 8
 gem "rspec-core", :path => "../rspec-core"
10 9
 gem "rspec-expectations", :path => "../rspec-expectations"
11  
-if RUBY_VERSION.to_s =~ /1.9/
  10
+
  11
+case RUBY_VERSION.to_s
  12
+when '1.9.2'
12 13
   gem "ruby-debug19"
13  
-else
  14
+when /^1.8/
14 15
   gem "ruby-debug"
15 16
 end
10  History.md
Source Rendered
... ...
@@ -0,0 +1,10 @@
  1
+## rspec-mocks release history (incomplete)
  2
+
  3
+### 2.0.0.beta.22 / 2010-09-12
  4
+
  5
+[full changelog](http://github.com/rspec/rspec-mocks/compare/v2.0.0.beta.20...v2.0.0.beta.22)
  6
+
  7
+* Bug fixes
  8
+  * fixed regression that broke obj.stub_chain(:a, :b => :c)
  9
+  * fixed regression that broke obj.stub_chain(:a, :b) { :c }
  10
+  * respond_to? always returns true when using as_null_object
29  Rakefile
... ...
@@ -1,36 +1,11 @@
1 1
 require 'bundler'
2 2
 Bundler.setup
  3
+Bundler::GemHelper.install_tasks
3 4
 
4 5
 require 'rake'
5  
-require 'rspec/mocks/version'
6 6
 require 'rspec/core/rake_task'
7 7
 require 'cucumber/rake/task'
8 8
 
9  
-begin
10  
-  require 'jeweler'
11  
-  Jeweler::Tasks.new do |gem|
12  
-    gem.name = "rspec-mocks"
13  
-    gem.version = RSpec::Mocks::Version::STRING
14  
-    gem.summary = "rspec-mocks-#{RSpec::Mocks::Version::STRING}"
15  
-    gem.description = "RSpec's 'test double' framework, with support for stubbing and mocking"
16  
-    gem.email = "dchelimsky@gmail.com;chad.humphries@gmail.com"
17  
-    gem.homepage = "http://github.com/rspec/mocks"
18  
-    gem.authors = ["David Chelimsky", "Chad Humphries"]    
19  
-    gem.rubyforge_project = "rspec"
20  
-    gem.add_development_dependency 'rspec-core', RSpec::Mocks::Version::STRING
21  
-    gem.add_development_dependency 'rspec-expectations', RSpec::Mocks::Version::STRING
22  
-  end
23  
-rescue LoadError
24  
-  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
25  
-end
26  
-
27  
-namespace :gem do
28  
-  desc "push to gemcutter"
29  
-  task :push => :build do
30  
-    system "gem push pkg/rspec-mocks-#{RSpec::Mocks::Version::STRING}.gem"
31  
-  end
32  
-end
33  
-
34 9
 RSpec::Core::RakeTask.new(:spec)
35 10
 
36 11
 RSpec::Core::RakeTask.new(:rcov) do |spec|
@@ -64,4 +39,4 @@ Rake::RDocTask.new do |rdoc|
64 39
   rdoc.rdoc_files.include('lib/**/*.rb')
65 40
 end
66 41
 
67  
-task :default => [:check_dependencies, :spec, :cucumber]
  42
+task :default => [:spec, :cucumber]
1  VERSION
... ...
@@ -1 +0,0 @@
1  
-2.0.0.beta.20
44  features/stubs/stub_chain.feature
... ...
@@ -0,0 +1,44 @@
  1
+Feature: stub_chain
  2
+
  3
+  The stub_chain method lets you to stub a chain of methods in one statement.
  4
+  Method chains are considered a design smell, but it's not really the method
  5
+  chain that is the problem - it's the dependency chain represented by a chain
  6
+  of messages to different objects:
  7
+
  8
+    foo.get_bar.get_baz
  9
+
  10
+  This is a Law of Demeter violation if get_bar() returns an object other than
  11
+  foo, and get_baz() returns yet another object.
  12
+
  13
+  Fluent interfaces look similar from a caller's perspective, but don't
  14
+  represent a dependency chain (the caller depends only on the object it is
  15
+  calling). Consider this common example from Ruby on Rails:
  16
+
  17
+    Article.recent.by(current_user)
  18
+
  19
+  The recent() and by() methods return the same object, so this is not
  20
+  a Law of Demeter violation.
  21
+
  22
+  Scenario: stub a chain of methods
  23
+    Given a file named "stub_chain_spec.rb" with:
  24
+      """
  25
+      describe "stubbing a chain of methods" do
  26
+        subject { Object.new }
  27
+
  28
+        context "given symbols representing methods" do
  29
+          it "returns the correct value" do
  30
+            subject.stub_chain(:one, :two, :three).and_return(:four)
  31
+            subject.one.two.three.should eq(:four)
  32
+          end
  33
+        end
  34
+
  35
+        context "given a string of methods separated by dots" do
  36
+          it "returns the correct value" do
  37
+            subject.stub_chain("one.two.three").and_return(:four)
  38
+            subject.one.two.three.should eq(:four)
  39
+          end
  40
+        end
  41
+      end
  42
+      """
  43
+    When I run "rspec stub_chain_spec.rb"
  44
+    Then the output should contain "2 examples, 0 failures"
29  lib/rspec/mocks/methods.rb
@@ -34,19 +34,19 @@ def unstub(sym)
34 34
       # == Examples
35 35
       #
36 36
       #   Article.stub_chain("recent.published") { [Article.new] }
37  
-      def stub_chain(*chain)
38  
-        methods = chain.join('.').split('.')
39  
-        if methods.length > 1
40  
-          if matching_stub = __mock_proxy.__send__(:find_matching_method_stub, methods[0].to_sym)
41  
-            methods.shift
42  
-            matching_stub.invoke.stub_chain(*methods)
  37
+      def stub_chain(*chain, &blk)
  38
+        chain, blk = format_chain(*chain, &blk)
  39
+        if chain.length > 1
  40
+          if matching_stub = __mock_proxy.__send__(:find_matching_method_stub, chain[0].to_sym)
  41
+            chain.shift
  42
+            matching_stub.invoke.stub_chain(*chain)
43 43
           else
44 44
             next_in_chain = Object.new
45  
-            stub(methods.shift) { next_in_chain }
46  
-            next_in_chain.stub_chain(*methods)
  45
+            stub(chain.shift) { next_in_chain }
  46
+            next_in_chain.stub_chain(*chain, &blk)
47 47
           end
48 48
         else
49  
-          stub(methods.shift)
  49
+          stub(chain.shift, &blk)
50 50
         end
51 51
       end
52 52
       
@@ -79,6 +79,17 @@ def __mock_proxy
79 79
           @mock_proxy ||= Proxy.new(self)
80 80
         end
81 81
       end
  82
+
  83
+      def format_chain(*chain, &blk)
  84
+        if Hash === chain.last
  85
+          hash = chain.pop
  86
+          hash.each do |k,v|
  87
+            chain << k
  88
+            blk = lambda { v }
  89
+          end
  90
+        end
  91
+        return chain.join('.').split('.'), blk
  92
+      end
82 93
     end
83 94
   end
84 95
 end
4  lib/rspec/mocks/mock.rb
@@ -34,6 +34,10 @@ def to_s
34 34
 
35 35
       alias_method :to_str, :to_s
36 36
 
  37
+      def respond_to?(sym, incl_private=false)
  38
+        __mock_proxy.null_object? ? true : super
  39
+      end
  40
+
37 41
     private
38 42
 
39 43
       def method_missing(sym, *args, &block)
2  lib/rspec/mocks/proxy.rb
@@ -37,7 +37,7 @@ def initialize(object, name=nil, options={})
37 37
       def null_object?
38 38
         @null_object
39 39
       end
40  
-      
  40
+
41 41
       # Tells the object to ignore any messages that aren't explicitly set as
42 42
       # stubs or message expectations.
43 43
       def as_null_object
2  lib/rspec/mocks/version.rb
... ...
@@ -1,7 +1,7 @@
1 1
 module RSpec # :nodoc:
2 2
   module Mocks # :nodoc:
3 3
     module Version # :nodoc:
4  
-      STRING = File.readlines(File.expand_path('../../../../VERSION', __FILE__)).first
  4
+      STRING = '2.0.0.beta.22'
5 5
     end
6 6
   end
7 7
 end
182  rspec-mocks.gemspec
... ...
@@ -1,170 +1,28 @@
1  
-# Generated by jeweler
2  
-# DO NOT EDIT THIS FILE DIRECTLY
3  
-# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4 1
 # -*- encoding: utf-8 -*-
  2
+$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
  3
+require "rspec/mocks/version"
5 4
 
6 5
 Gem::Specification.new do |s|
7  
-  s.name = %q{rspec-mocks}
8  
-  s.version = "2.0.0.beta.20"
  6
+  s.name        = "rspec-mocks"
  7
+  s.version     = RSpec::Mocks::Version::STRING
  8
+  s.platform    = Gem::Platform::RUBY
  9
+  s.authors     = ["David Chelimsky", "Chad Humphries"]
  10
+  s.email       = "dchelimsky@gmail.com;chad.humphries@gmail.com"
  11
+  s.homepage    = "http://github.com/rspec/rspec-mocks"
  12
+  s.summary     = "rspec-mocks-#{RSpec::Mocks::Version::STRING}"
  13
+  s.description = "RSpec's 'test double' framework, with support for stubbing and mocking"
9 14
 
10  
-  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11  
-  s.authors = ["David Chelimsky", "Chad Humphries"]
12  
-  s.date = %q{2010-08-24}
13  
-  s.description = %q{RSpec's 'test double' framework, with support for stubbing and mocking}
14  
-  s.email = %q{dchelimsky@gmail.com;chad.humphries@gmail.com}
15  
-  s.extra_rdoc_files = [
16  
-    "README.markdown"
17  
-  ]
18  
-  s.files = [
19  
-    ".autotest",
20  
-     ".document",
21  
-     ".gitignore",
22  
-     "Gemfile",
23  
-     "License.txt",
24  
-     "README.markdown",
25  
-     "Rakefile",
26  
-     "VERSION",
27  
-     "autotest/discover.rb",
28  
-     "cucumber.yml",
29  
-     "features/README.markdown",
30  
-     "features/configuration.feature",
31  
-     "features/mocks/block_local_expectations.feature",
32  
-     "features/mocks/warn_when_expectation_is_set_on_nil.feature",
33  
-     "features/stubs/stub_implementation.feature",
34  
-     "features/support/env.rb",
35  
-     "lib/rspec/mocks.rb",
36  
-     "lib/rspec/mocks/argument_expectation.rb",
37  
-     "lib/rspec/mocks/argument_matchers.rb",
38  
-     "lib/rspec/mocks/error_generator.rb",
39  
-     "lib/rspec/mocks/errors.rb",
40  
-     "lib/rspec/mocks/extensions.rb",
41  
-     "lib/rspec/mocks/extensions/instance_exec.rb",
42  
-     "lib/rspec/mocks/extensions/object.rb",
43  
-     "lib/rspec/mocks/framework.rb",
44  
-     "lib/rspec/mocks/message_expectation.rb",
45  
-     "lib/rspec/mocks/method_double.rb",
46  
-     "lib/rspec/mocks/methods.rb",
47  
-     "lib/rspec/mocks/mock.rb",
48  
-     "lib/rspec/mocks/order_group.rb",
49  
-     "lib/rspec/mocks/proxy.rb",
50  
-     "lib/rspec/mocks/space.rb",
51  
-     "lib/rspec/mocks/spec_methods.rb",
52  
-     "lib/rspec/mocks/version.rb",
53  
-     "lib/spec/mocks.rb",
54  
-     "rspec-mocks.gemspec",
55  
-     "spec/rspec/mocks/and_yield_spec.rb",
56  
-     "spec/rspec/mocks/any_number_of_times_spec.rb",
57  
-     "spec/rspec/mocks/argument_expectation_spec.rb",
58  
-     "spec/rspec/mocks/at_least_spec.rb",
59  
-     "spec/rspec/mocks/at_most_spec.rb",
60  
-     "spec/rspec/mocks/block_return_value_spec.rb",
61  
-     "spec/rspec/mocks/bug_report_10260_spec.rb",
62  
-     "spec/rspec/mocks/bug_report_10263_spec.rb",
63  
-     "spec/rspec/mocks/bug_report_11545_spec.rb",
64  
-     "spec/rspec/mocks/bug_report_15719_spec.rb",
65  
-     "spec/rspec/mocks/bug_report_496_spec.rb",
66  
-     "spec/rspec/mocks/bug_report_600_spec.rb",
67  
-     "spec/rspec/mocks/bug_report_7611_spec.rb",
68  
-     "spec/rspec/mocks/bug_report_7805_spec.rb",
69  
-     "spec/rspec/mocks/bug_report_8165_spec.rb",
70  
-     "spec/rspec/mocks/bug_report_8302_spec.rb",
71  
-     "spec/rspec/mocks/bug_report_830_spec.rb",
72  
-     "spec/rspec/mocks/bug_report_957_spec.rb",
73  
-     "spec/rspec/mocks/double_spec.rb",
74  
-     "spec/rspec/mocks/failing_argument_matchers_spec.rb",
75  
-     "spec/rspec/mocks/hash_including_matcher_spec.rb",
76  
-     "spec/rspec/mocks/hash_not_including_matcher_spec.rb",
77  
-     "spec/rspec/mocks/mock_ordering_spec.rb",
78  
-     "spec/rspec/mocks/mock_space_spec.rb",
79  
-     "spec/rspec/mocks/mock_spec.rb",
80  
-     "spec/rspec/mocks/multiple_return_value_spec.rb",
81  
-     "spec/rspec/mocks/nil_expectation_warning_spec.rb",
82  
-     "spec/rspec/mocks/null_object_mock_spec.rb",
83  
-     "spec/rspec/mocks/once_counts_spec.rb",
84  
-     "spec/rspec/mocks/options_hash_spec.rb",
85  
-     "spec/rspec/mocks/partial_mock_spec.rb",
86  
-     "spec/rspec/mocks/partial_mock_using_mocks_directly_spec.rb",
87  
-     "spec/rspec/mocks/passing_argument_matchers_spec.rb",
88  
-     "spec/rspec/mocks/precise_counts_spec.rb",
89  
-     "spec/rspec/mocks/record_messages_spec.rb",
90  
-     "spec/rspec/mocks/stash_spec.rb",
91  
-     "spec/rspec/mocks/stub_chain_spec.rb",
92  
-     "spec/rspec/mocks/stub_implementation_spec.rb",
93  
-     "spec/rspec/mocks/stub_spec.rb",
94  
-     "spec/rspec/mocks/stubbed_message_expectations_spec.rb",
95  
-     "spec/rspec/mocks/twice_counts_spec.rb",
96  
-     "spec/rspec/mocks_spec.rb",
97  
-     "spec/spec_helper.rb",
98  
-     "spec/support/macros.rb",
99  
-     "specs.watchr"
100  
-  ]
101  
-  s.homepage = %q{http://github.com/rspec/mocks}
102  
-  s.rdoc_options = ["--charset=UTF-8"]
103  
-  s.require_paths = ["lib"]
104  
-  s.rubyforge_project = %q{rspec}
105  
-  s.rubygems_version = %q{1.3.7}
106  
-  s.summary = %q{rspec-mocks-2.0.0.beta.20}
107  
-  s.test_files = [
108  
-    "spec/rspec/mocks/and_yield_spec.rb",
109  
-     "spec/rspec/mocks/any_number_of_times_spec.rb",
110  
-     "spec/rspec/mocks/argument_expectation_spec.rb",
111  
-     "spec/rspec/mocks/at_least_spec.rb",
112  
-     "spec/rspec/mocks/at_most_spec.rb",
113  
-     "spec/rspec/mocks/block_return_value_spec.rb",
114  
-     "spec/rspec/mocks/bug_report_10260_spec.rb",
115  
-     "spec/rspec/mocks/bug_report_10263_spec.rb",
116  
-     "spec/rspec/mocks/bug_report_11545_spec.rb",
117  
-     "spec/rspec/mocks/bug_report_15719_spec.rb",
118  
-     "spec/rspec/mocks/bug_report_496_spec.rb",
119  
-     "spec/rspec/mocks/bug_report_600_spec.rb",
120  
-     "spec/rspec/mocks/bug_report_7611_spec.rb",
121  
-     "spec/rspec/mocks/bug_report_7805_spec.rb",
122  
-     "spec/rspec/mocks/bug_report_8165_spec.rb",
123  
-     "spec/rspec/mocks/bug_report_8302_spec.rb",
124  
-     "spec/rspec/mocks/bug_report_830_spec.rb",
125  
-     "spec/rspec/mocks/bug_report_957_spec.rb",
126  
-     "spec/rspec/mocks/double_spec.rb",
127  
-     "spec/rspec/mocks/failing_argument_matchers_spec.rb",
128  
-     "spec/rspec/mocks/hash_including_matcher_spec.rb",
129  
-     "spec/rspec/mocks/hash_not_including_matcher_spec.rb",
130  
-     "spec/rspec/mocks/mock_ordering_spec.rb",
131  
-     "spec/rspec/mocks/mock_space_spec.rb",
132  
-     "spec/rspec/mocks/mock_spec.rb",
133  
-     "spec/rspec/mocks/multiple_return_value_spec.rb",
134  
-     "spec/rspec/mocks/nil_expectation_warning_spec.rb",
135  
-     "spec/rspec/mocks/null_object_mock_spec.rb",
136  
-     "spec/rspec/mocks/once_counts_spec.rb",
137  
-     "spec/rspec/mocks/options_hash_spec.rb",
138  
-     "spec/rspec/mocks/partial_mock_spec.rb",
139  
-     "spec/rspec/mocks/partial_mock_using_mocks_directly_spec.rb",
140  
-     "spec/rspec/mocks/passing_argument_matchers_spec.rb",
141  
-     "spec/rspec/mocks/precise_counts_spec.rb",
142  
-     "spec/rspec/mocks/record_messages_spec.rb",
143  
-     "spec/rspec/mocks/stash_spec.rb",
144  
-     "spec/rspec/mocks/stub_chain_spec.rb",
145  
-     "spec/rspec/mocks/stub_implementation_spec.rb",
146  
-     "spec/rspec/mocks/stub_spec.rb",
147  
-     "spec/rspec/mocks/stubbed_message_expectations_spec.rb",
148  
-     "spec/rspec/mocks/twice_counts_spec.rb",
149  
-     "spec/rspec/mocks_spec.rb",
150  
-     "spec/spec_helper.rb",
151  
-     "spec/support/macros.rb"
152  
-  ]
  15
+  s.rubygems_version   = "1.3.7"
  16
+  s.rubyforge_project  = "rspec"
153 17
 
154  
-  if s.respond_to? :specification_version then
155  
-    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
156  
-    s.specification_version = 3
  18
+  s.files            = `git ls-files`.split("\n")
  19
+  s.test_files       = `git ls-files -- {spec,features}/*`.split("\n")
  20
+  s.executables      = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
  21
+  s.extra_rdoc_files = [ "README.markdown" ]
  22
+  s.rdoc_options     = ["--charset=UTF-8"]
  23
+  s.require_path     = "lib"
157 24
 
158  
-    if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
159  
-      s.add_development_dependency(%q<rspec-core>, ["= 2.0.0.beta.20"])
160  
-      s.add_development_dependency(%q<rspec-expectations>, ["= 2.0.0.beta.20"])
161  
-    else
162  
-      s.add_dependency(%q<rspec-core>, ["= 2.0.0.beta.20"])
163  
-      s.add_dependency(%q<rspec-expectations>, ["= 2.0.0.beta.20"])
164  
-    end
165  
-  else
166  
-    s.add_dependency(%q<rspec-core>, ["= 2.0.0.beta.20"])
167  
-    s.add_dependency(%q<rspec-expectations>, ["= 2.0.0.beta.20"])
168  
-  end
  25
+  s.add_dependency "rspec-core",         RSpec::Mocks::Version::STRING
  26
+  s.add_dependency "rspec-expectations", RSpec::Mocks::Version::STRING
169 27
 end
170 28
 
0  rspec/mocks/extensions.rb b/lib/rspec/mocks/extensions.rb
No changes.
61  spec/rspec/mocks/null_object_mock_spec.rb
@@ -2,45 +2,57 @@
2 2
 
3 3
 module RSpec
4 4
   module Mocks
5  
-    describe "a mock acting as a NullObject" do
  5
+    describe "a double _not_ acting as a null object" do
6 6
       before(:each) do
7  
-        @mock = RSpec::Mocks::Mock.new("null_object").as_null_object
  7
+        @double = double('non-null object')
  8
+      end
  9
+
  10
+      it "says it does not respond to messages it doesn't understand" do
  11
+        @double.should_not respond_to(:foo)
  12
+      end
  13
+
  14
+      it "says it responds to messages it does understand" do
  15
+        @double.stub(:foo)
  16
+        @double.should respond_to(:foo)
  17
+      end
  18
+    end
  19
+
  20
+    describe "a double acting as a null object" do
  21
+      before(:each) do
  22
+        @double = double('null object').as_null_object
  23
+      end
  24
+
  25
+      it "says it responds to everything" do
  26
+        @double.should respond_to(:any_message_it_gets)
8 27
       end
9 28
 
10 29
       it "allows explicit expectation" do
11  
-        @mock.should_receive(:something)
12  
-        @mock.something
  30
+        @double.should_receive(:something)
  31
+        @double.something
13 32
       end
14 33
 
15 34
       it "fails verification when explicit exception not met" do
16 35
         lambda do
17  
-          @mock.should_receive(:something)
18  
-          @mock.rspec_verify
  36
+          @double.should_receive(:something)
  37
+          @double.rspec_verify
19 38
         end.should raise_error(RSpec::Mocks::MockExpectationError)
20 39
       end
21 40
 
22 41
       it "ignores unexpected methods" do
23  
-        @mock.random_call("a", "d", "c")
24  
-        @mock.rspec_verify
  42
+        @double.random_call("a", "d", "c")
  43
+        @double.rspec_verify
25 44
       end
26 45
 
27 46
       it "allows expected message with different args first" do
28  
-        @mock.should_receive(:message).with(:expected_arg)
29  
-        @mock.message(:unexpected_arg)
30  
-        @mock.message(:expected_arg)
  47
+        @double.should_receive(:message).with(:expected_arg)
  48
+        @double.message(:unexpected_arg)
  49
+        @double.message(:expected_arg)
31 50
       end
32 51
 
33 52
       it "allows expected message with different args second" do
34  
-        @mock.should_receive(:message).with(:expected_arg)
35  
-        @mock.message(:expected_arg)
36  
-        @mock.message(:unexpected_arg)
37  
-      end
38  
-    end
39  
-
40  
-    describe "#null_object?" do
41  
-      it "defaults to false" do
42  
-        obj = double('anything')
43  
-        obj.should_not be_null_object
  53
+        @double.should_receive(:message).with(:expected_arg)
  54
+        @double.message(:expected_arg)
  55
+        @double.message(:unexpected_arg)
44 56
       end
45 57
     end
46 58
     
@@ -50,5 +62,12 @@ module Mocks
50 62
         obj.should be_null_object
51 63
       end
52 64
     end
  65
+
  66
+    describe "#null_object?" do
  67
+      it "defaults to false" do
  68
+        obj = double('anything')
  69
+        obj.should_not be_null_object
  70
+      end
  71
+    end
53 72
   end
54 73
 end
21  spec/rspec/mocks/partial_mock_spec.rb
@@ -134,34 +134,19 @@ def private_method; end
134 134
 
135 135
       it 'keeps public methods public' do
136 136
         @object.should_receive(:public_method)
137  
-        with_ruby('1.9') do
138  
-          @object.public_methods.should include(:public_method)
139  
-        end
140  
-        with_ruby('1.8') do
141  
-          @object.public_methods.should include('public_method')
142  
-        end
  137
+        @object.public_methods.should include_method(:public_method)
143 138
         @object.public_method
144 139
       end
145 140
 
146 141
       it 'keeps private methods private' do
147 142
         @object.should_receive(:private_method)
148  
-        with_ruby('1.9') do
149  
-          @object.private_methods.should include(:private_method)
150  
-        end
151  
-        with_ruby('1.8') do
152  
-          @object.private_methods.should include('private_method')
153  
-        end
  143
+        @object.private_methods.should include_method(:private_method)
154 144
         @object.public_method
155 145
       end
156 146
 
157 147
       it 'keeps protected methods protected' do
158 148
         @object.should_receive(:protected_method)
159  
-        with_ruby('1.9') do
160  
-          @object.protected_methods.should include(:protected_method)
161  
-        end
162  
-        with_ruby('1.8') do
163  
-          @object.protected_methods.should include('protected_method')
164  
-        end
  149
+        @object.protected_methods.should include_method(:protected_method)
165 150
         @object.public_method
166 151
       end
167 152
 
79  spec/rspec/mocks/stub_chain_spec.rb
@@ -7,14 +7,81 @@ module Mocks
7 7
         @subject = Object.new
8 8
       end
9 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)
  10
+
  11
+      context "with one method in chain" do
  12
+        context "using and_return" do
  13
+          it "returns expected value from chaining only one method call" do
  14
+            @subject.stub_chain(:msg1).and_return(:return_value)
  15
+            @subject.msg1.should equal(:return_value)
  16
+          end
  17
+        end
  18
+
  19
+        context "using a block" do
  20
+          it "returns the correct value" do
  21
+            @subject.stub_chain(:msg1) { :return_value }
  22
+            @subject.msg1.should equal(:return_value)
  23
+          end
  24
+        end
  25
+
  26
+        context "using a hash" do
  27
+          it "returns the value of the key/value pair" do
  28
+            @subject.stub_chain(:msg1 => :return_value)
  29
+            @subject.msg1.should equal(:return_value)
  30
+          end
  31
+        end
  32
+      end
  33
+
  34
+      context "with two methods in chain" do
  35
+        context "using and_return" do
  36
+          it "returns expected value from chaining two method calls" do
  37
+            @subject.stub_chain(:msg1, :msg2).and_return(:return_value)
  38
+            @subject.msg1.msg2.should equal(:return_value)
  39
+          end
  40
+        end
  41
+
  42
+        context "using a block" do
  43
+          it "returns the correct value" do
  44
+            @subject.stub_chain(:msg1, :msg2) { :return_value }
  45
+            @subject.msg1.msg2.should equal(:return_value)
  46
+          end
  47
+        end
  48
+
  49
+        context "using a hash" do
  50
+          it "returns the value of the key/value pair" do
  51
+            @subject.stub_chain(:msg1, :msg2 => :return_value)
  52
+            @subject.msg1.msg2.should equal(:return_value)
  53
+          end
  54
+        end
13 55
       end
14 56
 
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)
  57
+      context "with four methods in chain" do
  58
+        context "using and_return" do
  59
+          it "returns expected value from chaining two method calls" do
  60
+            @subject.stub_chain(:msg1, :msg2, :msg3, :msg4).and_return(:return_value)
  61
+            @subject.msg1.msg2.msg3.msg4.should equal(:return_value)
  62
+          end
  63
+        end
  64
+
  65
+        context "using a block" do
  66
+          it "returns the correct value" do
  67
+            @subject.stub_chain(:msg1, :msg2, :msg3, :msg4) { :return_value }
  68
+            @subject.msg1.msg2.msg3.msg4.should equal(:return_value)
  69
+          end
  70
+        end
  71
+
  72
+        context "using a hash" do
  73
+          it "returns the value of the key/value pair" do
  74
+            @subject.stub_chain(:msg1, :msg2, :msg3, :msg4 => :return_value)
  75
+            @subject.msg1.msg2.msg3.msg4.should equal(:return_value)
  76
+          end
  77
+        end
  78
+
  79
+        context "using a hash with a string key" do
  80
+          it "returns the value of the key/value pair" do
  81
+            @subject.stub_chain("msg1.msg2.msg3.msg4" => :return_value)
  82
+            @subject.msg1.msg2.msg3.msg4.should equal(:return_value)
  83
+          end
  84
+        end
18 85
       end
19 86
 
20 87
       it "returns expected value from chaining four method calls" do
4  spec/rspec/mocks/stub_implementation_spec.rb
@@ -61,8 +61,8 @@ def obj.foo; :original; end
61 61
         obj = Object.new
62 62
         lambda do
63 63
           obj.unstub(:foo)
64  
-        end.should raise_error(MockExpectationError)
  64
+        end.should raise_error(RSpec::Mocks::MockExpectationError)
65 65
       end
66 66
     end
67 67
   end
68  
-end
  68
+end
16  spec/spec_helper.rb
@@ -5,12 +5,7 @@
5 5
 module Macros
6 6
   def treats_method_missing_as_private(options = {:noop => true, :subject => nil})
7 7
     it "has method_missing as private" do
8  
-      with_ruby 1.8 do
9  
-        self.class.describes.private_instance_methods.should include("method_missing")
10  
-      end
11  
-      with_ruby 1.9 do
12  
-        self.class.describes.private_instance_methods.should include(:method_missing)
13  
-      end
  8
+      self.class.describes.private_instance_methods.should include_method(:method_missing)
14 9
     end
15 10
 
16 11
     it "does not respond_to? method_missing (because it's private)" do
@@ -32,11 +27,9 @@ def treats_method_missing_as_private(options = {:noop => true, :subject => nil})
32 27
   end
33 28
 end
34 29
 
35  
-module RSpec  
36  
-  module Matchers
37  
-    def with_ruby(version)
38  
-      yield if RUBY_VERSION =~ Regexp.compile("^#{version.to_s}")
39  
-    end
  30
+RSpec::Matchers.define :include_method do |expected|
  31
+  match do |actual|
  32
+    actual.map { |m| m.to_s }.include?(expected.to_s)
40 33
   end
41 34
 end
42 35
 
@@ -44,6 +37,5 @@ def with_ruby(version)
44 37
   config.mock_with :rspec
45 38
   config.color_enabled = true
46 39
   config.extend(Macros)
47  
-  config.include(RSpec::Matchers)
48 40
   config.include(RSpec::Mocks::Methods)
49 41
 end
29  spec/support/macros.rb
... ...
@@ -1,29 +0,0 @@
1  
-module Macros
2  
-  def treats_method_missing_as_private(options = {:noop => true, :subject => nil})
3  
-    it "has method_missing as private" do
4  
-      with_ruby 1.8 do
5  
-        described_class.private_instance_methods.should include("method_missing")
6  
-      end
7  
-      with_ruby 1.9 do
8  
-        described_class.private_instance_methods.should include(:method_missing)
9  
-      end
10  
-    end
11  
-
12  
-    it "does not respond_to? method_missing (because it's private)" do
13  
-      formatter = options[:subject] || described_class.new({ }, StringIO.new)
14  
-      formatter.should_not respond_to(:method_missing)
15  
-    end
16  
-
17  
-    if options[:noop]
18  
-      it "should respond_to? all messages" do
19  
-        formatter = described_class.new({ }, StringIO.new)
20  
-        formatter.should respond_to(:just_about_anything)
21  
-      end
22  
-
23  
-      it "should respond_to? anything, when given the private flag" do
24  
-        formatter = described_class.new({ }, StringIO.new)
25  
-        formatter.respond_to?(:method_missing, true).should be_true
26  
-      end
27  
-    end
28  
-  end
29  
-end

No commit comments for this range

Something went wrong with that request. Please try again.