rspec 1.2.7 → 1.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/History.rdoc +19 -0
  2. data/Manifest.txt +5 -1
  3. data/features/expectations/customized_message.feature +54 -0
  4. data/features/matchers/define_matcher_with_fluent_interface.feature +27 -0
  5. data/lib/spec/example/example_group_methods.rb +2 -2
  6. data/lib/spec/example/subject.rb +4 -4
  7. data/lib/spec/expectations/extensions/kernel.rb +4 -4
  8. data/lib/spec/expectations/fail_with.rb +4 -2
  9. data/lib/spec/expectations/handler.rb +8 -8
  10. data/lib/spec/matchers.rb +3 -3
  11. data/lib/spec/matchers/be.rb +12 -2
  12. data/lib/spec/matchers/matcher.rb +2 -1
  13. data/lib/spec/mocks/message_expectation.rb +22 -19
  14. data/lib/spec/mocks/methods.rb +14 -3
  15. data/lib/spec/mocks/proxy.rb +28 -13
  16. data/lib/spec/runner/differs/default.rb +31 -0
  17. data/lib/spec/stubs/cucumber.rb +5 -0
  18. data/lib/spec/version.rb +1 -1
  19. data/spec/autotest/autotest_matchers.rb +4 -13
  20. data/spec/spec/example/example_group_methods_spec.rb +1 -1
  21. data/spec/spec/expectations/differs/default_spec.rb +54 -0
  22. data/spec/spec/expectations/extensions/{object_spec.rb → kernel_spec.rb} +0 -0
  23. data/spec/spec/expectations/fail_with_spec.rb +10 -2
  24. data/spec/spec/expectations/handler_spec.rb +18 -0
  25. data/spec/spec/matchers/be_spec.rb +2 -2
  26. data/spec/spec/matchers/have_spec.rb +14 -10
  27. data/spec/spec/mocks/stub_chain_spec.rb +9 -1
  28. data/spec/spec/mocks/unstub_spec.rb +127 -0
  29. data/spec/spec/runner/formatter/html_formatted-1.8.4.html +2 -1
  30. data/spec/spec/runner/formatter/html_formatted-1.8.5.html +2 -1
  31. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +2 -1
  32. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +2 -1
  33. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +2 -1
  34. data/spec/spec/runner/formatter/html_formatter_spec.rb +1 -1
  35. data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +2 -1
  36. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +2 -1
  37. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +2 -1
  38. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +2 -1
  39. metadata +10 -6
@@ -1,3 +1,22 @@
1
+ === Version 1.2.8 / 2008-07-16
2
+
3
+ * enhancements
4
+ * better messages for should[_not] be_nil (Chad Humphries and Rob Sanheim)
5
+ * should and should_not accept optional custom message
6
+ (suggestion from Rob Sanheim)
7
+ * result.should be_nil, "expected result to be nil"
8
+ * added 'spec/stubs/cucumber' to plug RSpec's stubbing framework into
9
+ Cucumber scenarios.
10
+ * added unstub method to remove a stub mid-example (Scott Taylor). Closes
11
+ #853.
12
+ * add more readable diff when expected and actual are hashes (Ryan Bigg).
13
+ Closes #848.
14
+
15
+ * bug fixes
16
+ * fixed --line option for ruby 1.9.1
17
+ * fix stub_chain conflict between two chains starting with the same message
18
+ (Mike Rohland). Closes #846.
19
+
1
20
  === Version 1.2.7 / 2009-06-22
2
21
 
3
22
  * enhancments
@@ -63,6 +63,7 @@ features/command_line/line_number_option_with_example_with_no_name.feature
63
63
  features/example_groups/example_group_with_should_methods.feature
64
64
  features/example_groups/implicit_docstrings.feature
65
65
  features/example_groups/nested_groups.feature
66
+ features/expectations/customized_message.feature
66
67
  features/expectations/expect_change.feature
67
68
  features/expectations/expect_error.feature
68
69
  features/extensions/custom_example_group.feature
@@ -75,6 +76,7 @@ features/interop/test_case_with_should_methods.feature
75
76
  features/matchers/define_diffable_matcher.feature
76
77
  features/matchers/define_matcher.feature
77
78
  features/matchers/define_matcher_outside_rspec.feature
79
+ features/matchers/define_matcher_with_fluent_interface.feature
78
80
  features/mock_framework_integration/use_flexmock.feature
79
81
  features/mock_framework_integration/use_mocha.feature
80
82
  features/mock_framework_integration/use_rr.feature
@@ -204,6 +206,7 @@ lib/spec/runner/line_number_query.rb
204
206
  lib/spec/runner/option_parser.rb
205
207
  lib/spec/runner/options.rb
206
208
  lib/spec/runner/reporter.rb
209
+ lib/spec/stubs/cucumber.rb
207
210
  lib/spec/test/unit.rb
208
211
  lib/spec/version.rb
209
212
  resources/helpers/cmdline.rb
@@ -237,7 +240,7 @@ spec/spec/example/shared_example_group_spec.rb
237
240
  spec/spec/example/subclassing_example_group_spec.rb
238
241
  spec/spec/example/subject_spec.rb
239
242
  spec/spec/expectations/differs/default_spec.rb
240
- spec/spec/expectations/extensions/object_spec.rb
243
+ spec/spec/expectations/extensions/kernel_spec.rb
241
244
  spec/spec/expectations/fail_with_spec.rb
242
245
  spec/spec/expectations/handler_spec.rb
243
246
  spec/spec/expectations/wrap_expectation_spec.rb
@@ -314,6 +317,7 @@ spec/spec/mocks/stub_implementation_spec.rb
314
317
  spec/spec/mocks/stub_spec.rb
315
318
  spec/spec/mocks/stubbed_message_expectations_spec.rb
316
319
  spec/spec/mocks/twice_counts_spec.rb
320
+ spec/spec/mocks/unstub_spec.rb
317
321
  spec/spec/package/bin_spec_spec.rb
318
322
  spec/spec/rake/spectask_spec.rb
319
323
  spec/spec/runner/class_and_argument_parser_spec.rb
@@ -0,0 +1,54 @@
1
+ Feature: customized message
2
+
3
+ In order to get the feedback I want
4
+ As an RSpec user
5
+ I want to customize the failure message per example
6
+
7
+ Scenario: one additional method
8
+ Given a file named "node_spec.rb.rb" with:
9
+ """
10
+ class Node
11
+ def initialize(state=:waiting)
12
+ @state = state
13
+ end
14
+ def state
15
+ @state
16
+ end
17
+ def waiting?
18
+ @state == :waiting
19
+ end
20
+ def started?
21
+ @state == :started
22
+ end
23
+ def start
24
+ @state = :started
25
+ end
26
+ end
27
+
28
+ describe "a new Node" do
29
+ it "should be waiting" do
30
+ node = Node.new(:started) #start w/ started to trigger failure
31
+ node.should be_waiting, "node.state: #{node.state} (first example)"
32
+ end
33
+
34
+ it "should not be started" do
35
+ node = Node.new(:started) #start w/ started to trigger failure
36
+ node.should_not be_started, "node.state: #{node.state} (second example)"
37
+ end
38
+ end
39
+
40
+ describe "node.start" do
41
+ it "should change the state" do
42
+ node = Node.new(:started) #start w/ started to trigger failure
43
+ lambda {node.start}.should change{node.state}, "expected a change"
44
+ end
45
+ end
46
+
47
+ """
48
+ When I run "spec node_spec.rb.rb --format specdoc"
49
+ Then the stdout should match "3 examples, 3 failures"
50
+ And the stdout should not match "to return true, got false"
51
+ And the stdout should not match "to return false, got true"
52
+ And the stdout should match "node.state: started (first example)"
53
+ And the stdout should match "node.state: started (second example)"
54
+ And the stdout should match "expected a change"
@@ -0,0 +1,27 @@
1
+ Feature: define matcher
2
+
3
+ In order to express my domain clearly in my code examples
4
+ As an RSpec user
5
+ I want to define matchers with fluent interfaces
6
+
7
+ Scenario: one additional method
8
+ Given a file named "between_spec.rb" with:
9
+ """
10
+ Spec::Matchers.define :be_bigger_than do |first|
11
+ def but_smaller_than(second)
12
+ @second = second
13
+ self
14
+ end
15
+
16
+ match do |actual|
17
+ (actual > first) && (actual < @second)
18
+ end
19
+ end
20
+
21
+ describe 5 do
22
+ it { should be_bigger_than(4).but_smaller_than(6) }
23
+ end
24
+ """
25
+ When I run "spec between_spec.rb --format specdoc"
26
+ Then the stdout should match "1 example, 0 failures"
27
+ And the stdout should match "should be bigger than 4"
@@ -226,10 +226,10 @@ module Spec
226
226
  def examples_to_run(run_options)
227
227
  return example_proxies unless examples_were_specified?(run_options)
228
228
  if run_options.line_number_requested?
229
- if location =~ /:#{run_options.example_line}$/
229
+ if location =~ /:#{run_options.example_line}:?/
230
230
  example_proxies
231
231
  else
232
- example_proxies.select {|proxy| proxy.location =~ /:#{run_options.example_line}$/}
232
+ example_proxies.select {|proxy| proxy.location =~ /:#{run_options.example_line}:?/}
233
233
  end
234
234
  else
235
235
  example_proxies.reject do |proxy|
@@ -79,8 +79,8 @@ module Spec
79
79
  # describe Person do
80
80
  # it { should be_eligible_to_vote }
81
81
  # end
82
- def should(matcher=nil)
83
- self == subject ? self.__should_for_example_group__(matcher) : subject.should(matcher)
82
+ def should(matcher=nil, message=nil)
83
+ self == subject ? self.__should_for_example_group__(matcher) : subject.should(matcher,message)
84
84
  end
85
85
 
86
86
  # Just like +should+, +should_not+ delegates to the subject (implicit or
@@ -91,8 +91,8 @@ module Spec
91
91
  # describe Person do
92
92
  # it { should_not be_eligible_to_vote }
93
93
  # end
94
- def should_not(matcher=nil)
95
- self == subject ? self.__should_not_for_example_group__(matcher) : subject.should_not(matcher)
94
+ def should_not(matcher=nil, message=nil)
95
+ self == subject ? self.__should_not_for_example_group__(matcher) : subject.should_not(matcher,message)
96
96
  end
97
97
  end
98
98
  end
@@ -23,8 +23,8 @@ module Kernel
23
23
  #
24
24
  # NOTE that this does NOT support receiver.should != expected.
25
25
  # Instead, use receiver.should_not == expected
26
- def should(matcher=nil, &block)
27
- Spec::Expectations::PositiveExpectationHandler.handle_matcher(self, matcher, &block)
26
+ def should(matcher=nil, message=nil, &block)
27
+ Spec::Expectations::PositiveExpectationHandler.handle_matcher(self, matcher, message, &block)
28
28
  end
29
29
 
30
30
  # :call-seq:
@@ -46,7 +46,7 @@ module Kernel
46
46
  # => Passes unless (receiver =~ regexp)
47
47
  #
48
48
  # See Spec::Matchers for more information about matchers
49
- def should_not(matcher=nil, &block)
50
- Spec::Expectations::NegativeExpectationHandler.handle_matcher(self, matcher, &block)
49
+ def should_not(matcher=nil, message=nil, &block)
50
+ Spec::Expectations::NegativeExpectationHandler.handle_matcher(self, matcher, message, &block)
51
51
  end
52
52
  end
@@ -31,9 +31,11 @@ NOTICE
31
31
  end
32
32
  unless (differ.nil? || expected.nil? || target.nil?)
33
33
  if expected.is_a?(String)
34
- message << "\nDiff:" << self.differ.diff_as_string(target.to_s, expected)
34
+ message << "\n\n Diff:" << self.differ.diff_as_string(target.to_s, expected)
35
+ elsif expected.is_a?(Hash) && target.is_a?(Hash)
36
+ message << "\n\n Diff:" << self.differ.diff_as_hash(target, expected)
35
37
  elsif !target.is_a?(Proc)
36
- message << "\nDiff:" << self.differ.diff_as_object(target, expected)
38
+ message << "\n\n Diff:" << self.differ.diff_as_object(target, expected)
37
39
  end
38
40
  end
39
41
  Kernel::raise(Spec::Expectations::ExpectationNotMetError.new(message))
@@ -3,7 +3,7 @@ module Spec
3
3
  class InvalidMatcherError < ArgumentError; end
4
4
 
5
5
  class PositiveExpectationHandler
6
- def self.handle_matcher(actual, matcher, &block)
6
+ def self.handle_matcher(actual, matcher, message=nil, &block)
7
7
  ::Spec::Matchers.last_should = :should
8
8
  ::Spec::Matchers.last_matcher = matcher
9
9
  return ::Spec::Matchers::PositiveOperatorMatcher.new(actual) if matcher.nil?
@@ -11,9 +11,9 @@ module Spec
11
11
  match = matcher.matches?(actual, &block)
12
12
  return match if match
13
13
 
14
- message = matcher.respond_to?(:failure_message_for_should) ?
15
- matcher.failure_message_for_should :
16
- matcher.failure_message
14
+ message ||= matcher.respond_to?(:failure_message_for_should) ?
15
+ matcher.failure_message_for_should :
16
+ matcher.failure_message
17
17
 
18
18
  if matcher.respond_to?(:diffable?) && matcher.diffable?
19
19
  ::Spec::Expectations.fail_with message, matcher.expected.first, matcher.actual
@@ -24,7 +24,7 @@ module Spec
24
24
  end
25
25
 
26
26
  class NegativeExpectationHandler
27
- def self.handle_matcher(actual, matcher, &block)
27
+ def self.handle_matcher(actual, matcher, message=nil, &block)
28
28
  ::Spec::Matchers.last_should = :should_not
29
29
  ::Spec::Matchers.last_matcher = matcher
30
30
  return ::Spec::Matchers::NegativeOperatorMatcher.new(actual) if matcher.nil?
@@ -34,9 +34,9 @@ module Spec
34
34
  matcher.matches?(actual, &block)
35
35
  return match unless match
36
36
 
37
- message = matcher.respond_to?(:failure_message_for_should_not) ?
38
- matcher.failure_message_for_should_not :
39
- matcher.negative_failure_message
37
+ message ||= matcher.respond_to?(:failure_message_for_should_not) ?
38
+ matcher.failure_message_for_should_not :
39
+ matcher.negative_failure_message
40
40
 
41
41
  if matcher.respond_to?(:diffable?) && matcher.diffable?
42
42
  ::Spec::Expectations.fail_with message, matcher.expected.first, matcher.actual
@@ -108,7 +108,7 @@ module Spec
108
108
  #
109
109
  # You can create such a matcher like so:
110
110
  #
111
- # Spec::Matchers.create :be_in_zone do |zone|
111
+ # Spec::Matchers.define :be_in_zone do |zone|
112
112
  # match do |player|
113
113
  # player.in_zone?(zone)
114
114
  # end
@@ -118,7 +118,7 @@ module Spec
118
118
  # with logical default messages for failures. You can override the failure
119
119
  # messages and the generated description as follows:
120
120
  #
121
- # Spec::Matchers.create :be_in_zone do |zone|
121
+ # Spec::Matchers.define :be_in_zone do |zone|
122
122
  # match do |player|
123
123
  # player.in_zone?(zone)
124
124
  # end
@@ -192,4 +192,4 @@ module Spec
192
192
  # end
193
193
  #
194
194
  module Matchers; end
195
- end
195
+ end
@@ -30,14 +30,24 @@ module Spec
30
30
  end
31
31
 
32
32
  def failure_message_for_should
33
- handling_predicate? ?
34
- "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}" :
33
+ if handling_predicate?
34
+ if predicate == :nil?
35
+ "expected nil, got #{@actual.inspect}"
36
+ else
37
+ "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}"
38
+ end
39
+ else
35
40
  "expected #{@comparison_method} #{expected}, got #{@actual.inspect}".gsub(' ',' ')
41
+ end
36
42
  end
37
43
 
38
44
  def failure_message_for_should_not
39
45
  if handling_predicate?
46
+ if predicate == :nil?
47
+ "expected not nil, got nil"
48
+ else
40
49
  "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}"
50
+ end
41
51
  else
42
52
  message = <<-MESSAGE
43
53
  'should_not be #{@comparison_method} #{expected}' not only FAILED,
@@ -6,8 +6,9 @@ module Spec
6
6
  attr_reader :expected, :actual
7
7
 
8
8
  def initialize(name, *expected, &declarations)
9
- @name = name
9
+ @name = name
10
10
  @expected = expected
11
+ @actual = nil
11
12
  @diffable = false
12
13
  @messages = {
13
14
  :description => lambda {"#{name_to_sentence}#{expected_to_sentence}"},
@@ -14,7 +14,6 @@ module Spec
14
14
  @expected_from = expected_from
15
15
  @sym = sym
16
16
  @method_block = method_block
17
- @return_block = nil
18
17
  @actual_received_count = 0
19
18
  @expected_received_count = expected_received_count
20
19
  @args_expectation = ArgumentExpectation.new([ArgumentMatchers::AnyArgsMatcher.new])
@@ -94,7 +93,7 @@ module Spec
94
93
  @sym == sym and @args_expectation.args_match?(args)
95
94
  end
96
95
 
97
- def invoke(args, block)
96
+ def invoke(*args, &block)
98
97
  if @expected_received_count == 0
99
98
  @failed_fast = true
100
99
  @actual_received_count += 1
@@ -109,17 +108,17 @@ module Spec
109
108
 
110
109
 
111
110
  if !@method_block.nil?
112
- default_return_val = invoke_method_block(args)
111
+ default_return_val = invoke_method_block(*args)
113
112
  elsif @args_to_yield.size > 0
114
- default_return_val = invoke_with_yield(block)
113
+ default_return_val = invoke_with_yield(&block)
115
114
  else
116
115
  default_return_val = nil
117
116
  end
118
117
 
119
118
  if @consecutive
120
- return invoke_consecutive_return_block(args, block)
119
+ return invoke_consecutive_return_block(*args, &block)
121
120
  elsif @return_block
122
- return invoke_return_block(args, block)
121
+ return invoke_return_block(*args, &block)
123
122
  else
124
123
  return default_return_val
125
124
  end
@@ -133,9 +132,17 @@ module Spec
133
132
  @actual_received_count >= @expected_received_count
134
133
  end
135
134
 
135
+ def invoke_return_block(*args, &block)
136
+ args << block unless block.nil?
137
+ # Ruby 1.9 - when we set @return_block to return values
138
+ # regardless of arguments, any arguments will result in
139
+ # a "wrong number of arguments" error
140
+ @return_block.arity == 0 ? @return_block.call : @return_block.call(*args)
141
+ end
142
+
136
143
  protected
137
144
 
138
- def invoke_method_block(args)
145
+ def invoke_method_block(*args)
139
146
  begin
140
147
  @method_block.call(*args)
141
148
  rescue => detail
@@ -143,7 +150,7 @@ module Spec
143
150
  end
144
151
  end
145
152
 
146
- def invoke_with_yield(block)
153
+ def invoke_with_yield(&block)
147
154
  if block.nil?
148
155
  @error_generator.raise_missing_block_error @args_to_yield
149
156
  end
@@ -157,20 +164,12 @@ module Spec
157
164
  value
158
165
  end
159
166
 
160
- def invoke_consecutive_return_block(args, block)
161
- value = invoke_return_block(args, block)
167
+ def invoke_consecutive_return_block(*args, &block)
168
+ value = invoke_return_block(*args, &block)
162
169
  index = [@actual_received_count, value.size-1].min
163
170
  value[index]
164
171
  end
165
172
 
166
- def invoke_return_block(args, block)
167
- args << block unless block.nil?
168
- # Ruby 1.9 - when we set @return_block to return values
169
- # regardless of arguments, any arguments will result in
170
- # a "wrong number of arguments" error
171
- @return_block.arity == 0 ? @return_block.call : @return_block.call(*args)
172
- end
173
-
174
173
  def clone_args_to_yield(args)
175
174
  @args_to_yield = args.clone
176
175
  @args_to_yield_were_cloned = true
@@ -182,9 +181,13 @@ module Spec
182
181
  end
183
182
 
184
183
  class MessageExpectation < BaseExpectation
184
+
185
+ def matches_name?(sym)
186
+ @sym == sym
187
+ end
185
188
 
186
189
  def matches_name_but_not_args(sym, args)
187
- @sym == sym and not @args_expectation.args_match?(args)
190
+ matches_name?(sym) and not @args_expectation.args_match?(args)
188
191
  end
189
192
 
190
193
  def verify_messages_received
@@ -19,11 +19,22 @@ module Spec
19
19
 
20
20
  alias_method :stub, :stub!
21
21
 
22
+ def unstub!(message)
23
+ __mock_proxy.remove_stub(message)
24
+ end
25
+
26
+ alias_method :unstub, :unstub!
27
+
22
28
  def stub_chain(*methods)
23
29
  if methods.length > 1
24
- next_in_chain = Object.new
25
- stub!(methods.shift) {next_in_chain}
26
- next_in_chain.stub_chain(*methods)
30
+ if matching_stub = __mock_proxy.find_matching_method_stub(methods[0])
31
+ methods.shift
32
+ matching_stub.invoke_return_block.stub_chain(*methods)
33
+ else
34
+ next_in_chain = Object.new
35
+ stub!(methods.shift) {next_in_chain}
36
+ next_in_chain.stub_chain(*methods)
37
+ end
27
38
  else
28
39
  stub!(methods.shift)
29
40
  end
@@ -61,6 +61,17 @@ module Spec
61
61
  @stubs.unshift MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, nil, :any, opts, &implementation)
62
62
  @stubs.first
63
63
  end
64
+
65
+ def remove_stub(message)
66
+ message = message.to_sym
67
+
68
+ if stub_to_remove = @stubs.detect { |s| s.matches_name?(message) }
69
+ reset_proxied_method(message)
70
+ @stubs.delete(stub_to_remove)
71
+ else
72
+ raise MockExpectationError, "The method `#{message}` was not stubbed or was already unstubbed"
73
+ end
74
+ end
64
75
 
65
76
  def verify #:nodoc:
66
77
  verify_expectations
@@ -96,9 +107,9 @@ module Spec
96
107
  if expectation = find_almost_matching_expectation(sym, *args)
97
108
  expectation.advise(args, block) unless expectation.expected_messages_received?
98
109
  end
99
- stub.invoke(args, block)
110
+ stub.invoke(*args, &block)
100
111
  elsif expectation
101
- expectation.invoke(args, block)
112
+ expectation.invoke(*args, &block)
102
113
  elsif expectation = find_almost_matching_expectation(sym, *args)
103
114
  expectation.advise(args, block) if null_object? unless expectation.expected_messages_received?
104
115
  raise_unexpected_message_args_error(expectation, *args) unless (has_negative_expectation?(sym) or null_object?)
@@ -115,6 +126,10 @@ module Spec
115
126
  @error_generator.raise_unexpected_message_error sym, *args
116
127
  end
117
128
 
129
+ def find_matching_method_stub(sym, *args)
130
+ @stubs.find {|stub| stub.matches(sym, args)}
131
+ end
132
+
118
133
  private
119
134
 
120
135
  def __add(sym)
@@ -193,13 +208,17 @@ module Spec
193
208
 
194
209
  def reset_proxied_methods
195
210
  @proxied_methods.each do |sym|
196
- munged_sym = munge(sym)
197
- target_metaclass.instance_eval do
198
- remove_method sym
199
- if method_defined?(munged_sym)
200
- alias_method sym, munged_sym
201
- remove_method munged_sym
202
- end
211
+ reset_proxied_method(sym)
212
+ end
213
+ end
214
+
215
+ def reset_proxied_method(sym)
216
+ munged_sym = munge(sym)
217
+ target_metaclass.instance_eval do
218
+ remove_method sym
219
+ if method_defined?(munged_sym)
220
+ alias_method sym, munged_sym
221
+ remove_method munged_sym
203
222
  end
204
223
  end
205
224
  end
@@ -221,10 +240,6 @@ module Spec
221
240
  @expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)}
222
241
  end
223
242
 
224
- def find_matching_method_stub(sym, *args)
225
- @stubs.find {|stub| stub.matches(sym, args)}
226
- end
227
-
228
243
  end
229
244
  end
230
245
  end
@@ -45,6 +45,37 @@ module Spec
45
45
  def diff_as_object(target,expected)
46
46
  diff_as_string(PP.pp(target,""), PP.pp(expected,""))
47
47
  end
48
+
49
+ def diff_as_hash(target, expected)
50
+ contains_hash = false
51
+ contains_array = false
52
+
53
+ extra_expected_keys = expected.keys - target.keys
54
+ extra_target_keys = target.keys - expected.keys
55
+
56
+ o = "\n"
57
+
58
+ o << "Expected hash contains keys that target hash does not: " << extra_expected_keys.inspect << "\n" if !extra_expected_keys.empty?
59
+ o << "Target hash contains keys that expected hash does not: " << extra_target_keys.inspect << "\n" if !extra_target_keys.empty?
60
+
61
+ expected.delete_if do |key, value|
62
+ contains_hash = true if value.is_a?(Hash)
63
+ contains_array = true if value.is_a?(Array)
64
+ target[key] == value
65
+ end
66
+
67
+ expected.keys.sort { |a,b| a.to_s <=> b.to_s }.each do |key|
68
+ o << "Expected the key #{key.inspect} to be #{expected[key].inspect}, but was #{target[key].inspect}\n"
69
+ end
70
+
71
+ o << "\n"
72
+
73
+ if contains_hash || contains_array
74
+ o << diff_as_object(target, expected)
75
+ else
76
+ o
77
+ end
78
+ end
48
79
 
49
80
  protected
50
81
  def format
@@ -0,0 +1,5 @@
1
+ # This plugs RSpec's mocking/stubbing framework into cucumber
2
+ require 'spec/mocks'
3
+ Before {$rspec_stubs ||= Spec::Mocks::Space.new}
4
+ After {$rspec_stubs.reset_all}
5
+ World(Spec::Mocks::ExampleMethods)
@@ -3,7 +3,7 @@ module Spec # :nodoc:
3
3
  unless defined? MAJOR
4
4
  MAJOR = 1
5
5
  MINOR = 2
6
- TINY = 7
6
+ TINY = 8
7
7
  PRE = nil
8
8
 
9
9
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
@@ -11,7 +11,7 @@ module Spec
11
11
  end
12
12
 
13
13
  def matches?(autotest)
14
- @autotest = prepare autotest
14
+ @autotest = prepare(autotest)
15
15
  @actual = autotest.test_files_for(@file)
16
16
  @actual == @specs
17
17
  end
@@ -20,21 +20,12 @@ module Spec
20
20
  "expected #{@autotest.class} to map #{@specs.inspect} to #{@file.inspect}\ngot #{@actual.inspect}"
21
21
  end
22
22
 
23
- private
24
- def prepare autotest
25
- stub_found_files autotest
26
- stub_find_order autotest
27
- autotest
28
- end
29
-
30
- def stub_found_files autotest
31
- found_files = @specs.inject({}){|h,f| h[f] = Time.at(0)}
32
- autotest.stub!(:find_files).and_return(found_files)
33
- end
23
+ private
34
24
 
35
- def stub_find_order autotest
25
+ def prepare(autotest)
36
26
  find_order = @specs.dup << @file
37
27
  autotest.instance_eval { @find_order = find_order }
28
+ autotest
38
29
  end
39
30
 
40
31
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
2
 
3
3
  module Spec
4
4
  module Example
@@ -73,6 +73,60 @@ EOD
73
73
  diff = @differ.diff_as_object(expected,actual)
74
74
  diff.should == expected_diff
75
75
  end
76
+
77
+ it "should output a friendly message if comparing simple hashes" do
78
+ expected = { "foo" => "bar" }
79
+ actual = { "foo" => "baz" }
80
+
81
+ expected_diff = <<'EOD'
82
+
83
+ Expected the key "foo" to be "bar", but was "baz"
84
+
85
+ EOD
86
+
87
+
88
+ diff = @differ.diff_as_hash(actual, expected)
89
+ diff.should == expected_diff
90
+ end
91
+
92
+
93
+ it "should output a friendly message if comparing simple hashes that contain different keys" do
94
+ expected = { "bar" => "foo" }
95
+ actual = { "foo" => "baz" }
96
+
97
+ expected_diff = <<'EOD'
98
+
99
+ Expected hash contains keys that target hash does not: ["bar"]
100
+ Target hash contains keys that expected hash does not: ["foo"]
101
+ Expected the key "bar" to be "foo", but was nil
102
+
103
+ EOD
104
+
105
+
106
+ diff = @differ.diff_as_hash(actual, expected)
107
+ diff.should == expected_diff
108
+ end
109
+
110
+ it "should output diff message if the hash is complex (containing Array or Hash)" do
111
+ expected = { "foo" => "bar", "fizz" => [1, 2, 3] }
112
+ actual = { "foo" => "baz", "fizz" => [1, 2] }
113
+
114
+ expected_diff = <<'EOD'
115
+
116
+ Expected the key "fizz" to be [1, 2, 3], but was [1, 2]
117
+ Expected the key "foo" to be "bar", but was "baz"
118
+
119
+
120
+ @@ -1,2 +1,2 @@
121
+ -{"foo"=>"bar", "fizz"=>[1, 2, 3]}
122
+ +{"foo"=>"baz", "fizz"=>[1, 2]}
123
+ EOD
124
+
125
+
126
+ diff = @differ.diff_as_hash(actual, expected)
127
+ diff.should == expected_diff
128
+ end
129
+
76
130
 
77
131
  it "should output unified diff message of two objects" do
78
132
  expected = Spec::Fixtures::Animal.new "bob", "giraffe"
@@ -47,19 +47,27 @@ describe Spec::Expectations, "#fail_with with diff" do
47
47
  @differ.should_receive(:diff_as_string).and_return("diff")
48
48
  lambda {
49
49
  Spec::Expectations.fail_with "the message", "expected", "actual"
50
- }.should fail_with("the message\nDiff:diff")
50
+ }.should fail_with("the message\n\n Diff:diff")
51
51
  end
52
52
 
53
53
  it "should call differ if expected/actual are not strings" do
54
54
  @differ.should_receive(:diff_as_object).and_return("diff")
55
55
  lambda {
56
56
  Spec::Expectations.fail_with "the message", :expected, :actual
57
- }.should fail_with("the message\nDiff:diff")
57
+ }.should fail_with("the message\n\n Diff:diff")
58
+ end
59
+
60
+ it "should call differ if expected/actual are both hashes" do
61
+ @differ.should_receive(:diff_as_hash).and_return("diff")
62
+ lambda {
63
+ Spec::Expectations.fail_with "the message", {:a => :b}, {:a => 'b'}
64
+ }.should fail_with("the message\n\n Diff:diff")
58
65
  end
59
66
 
60
67
  it "should not call differ if expected or actual are procs" do
61
68
  @differ.should_not_receive(:diff_as_string)
62
69
  @differ.should_not_receive(:diff_as_object)
70
+ @differ.should_not_receive(:diff_as_hash)
63
71
  lambda {
64
72
  Spec::Expectations.fail_with "the message", lambda {}, lambda {}
65
73
  }.should fail_with("the message")
@@ -95,6 +95,15 @@ module Spec
95
95
  Spec::Expectations::PositiveExpectationHandler.handle_matcher(actual, matcher)
96
96
 
97
97
  end
98
+
99
+ it "appends the :or message in the options hash passed to should" do
100
+ matcher = mock("matcher", :failure_message_for_should => "message", :matches? => false)
101
+ actual = Object.new
102
+
103
+ ::Spec::Expectations.should_receive(:fail_with).with("custom")
104
+
105
+ Spec::Expectations::PositiveExpectationHandler.handle_matcher(actual, matcher, "custom")
106
+ end
98
107
  end
99
108
  end
100
109
 
@@ -160,6 +169,15 @@ module Spec
160
169
  Spec::Expectations::NegativeExpectationHandler.handle_matcher(actual, matcher)
161
170
  end
162
171
 
172
+ it "appends the :or message in the options hash passed to should" do
173
+ matcher = mock("matcher", :failure_message_for_should_not => "message", :matches? => true)
174
+ actual = Object.new
175
+
176
+ ::Spec::Expectations.should_receive(:fail_with).with("custom")
177
+
178
+ Spec::Expectations::NegativeExpectationHandler.handle_matcher(actual, matcher, "custom")
179
+ end
180
+
163
181
  end
164
182
  end
165
183
 
@@ -137,7 +137,7 @@ describe "should be_nil" do
137
137
  it "should fail when actual is not nil" do
138
138
  lambda {
139
139
  :not_nil.should be_nil
140
- }.should fail_with("expected nil? to return true, got false")
140
+ }.should fail_with("expected nil, got :not_nil")
141
141
  end
142
142
  end
143
143
 
@@ -149,7 +149,7 @@ describe "should_not be_nil" do
149
149
  it "should fail when actual is nil" do
150
150
  lambda {
151
151
  nil.should_not be_nil
152
- }.should fail_with("expected nil? to return false, got true")
152
+ }.should fail_with("expected not nil, got nil")
153
153
  end
154
154
  end
155
155
 
@@ -3,15 +3,17 @@ require File.dirname(__FILE__) + '/../../spec_helper.rb'
3
3
  share_as :HaveSpecHelper do
4
4
  def create_collection_owner_with(n)
5
5
  owner = Spec::Expectations::Helper::CollectionOwner.new
6
- (1..n).each do |n|
7
- owner.add_to_collection_with_length_method(n)
8
- owner.add_to_collection_with_size_method(n)
6
+ (1..n).each do |number|
7
+ owner.add_to_collection_with_length_method(number)
8
+ owner.add_to_collection_with_size_method(number)
9
9
  end
10
10
  owner
11
11
  end
12
12
  before(:each) do
13
- unless defined?(::ActiveSupport::Inflector)
14
- @active_support_was_not_defined
13
+ if defined?(::ActiveSupport::Inflector)
14
+ @active_support_was_defined = true
15
+ else
16
+ @active_support_was_defined = false
15
17
  module ::ActiveSupport
16
18
  class Inflector
17
19
  def self.pluralize(string)
@@ -69,7 +71,7 @@ describe 'should have(1).item when ActiveSupport::Inflector is defined' do
69
71
  end
70
72
 
71
73
  after(:each) do
72
- if @active_support_was_not_defined
74
+ unless @active_support_was_defined
73
75
  Object.__send__ :remove_const, :ActiveSupport
74
76
  end
75
77
  end
@@ -79,9 +81,11 @@ describe 'should have(1).item when Inflector is defined' do
79
81
  include HaveSpecHelper
80
82
 
81
83
  before(:each) do
82
- unless defined?(Inflector)
83
- @inflector_was_not_defined
84
- class Inflector
84
+ if defined?(Inflector)
85
+ @inflector_was_defined = true
86
+ else
87
+ @inflector_was_defined = false
88
+ class ::Inflector
85
89
  def self.pluralize(string)
86
90
  string.to_s + 's'
87
91
  end
@@ -95,7 +99,7 @@ describe 'should have(1).item when Inflector is defined' do
95
99
  end
96
100
 
97
101
  after(:each) do
98
- if @inflector_was_not_defined
102
+ unless @inflector_was_defined
99
103
  Object.__send__ :remove_const, :Inflector
100
104
  end
101
105
  end
@@ -22,13 +22,21 @@ module Spec
22
22
  @subject.msg1.msg2.msg3.msg4.should equal(:return_value)
23
23
  end
24
24
 
25
- it "returns expected value from chaining four method calls twice with some shared" do
25
+ it "returns expected value from two chains with shared messages at the end" do
26
26
  @subject.stub_chain(:msg1, :msg2, :msg3, :msg4).and_return(:first)
27
27
  @subject.stub_chain(:msg5, :msg2, :msg3, :msg4).and_return(:second)
28
28
 
29
29
  @subject.msg1.msg2.msg3.msg4.should equal(:first)
30
30
  @subject.msg5.msg2.msg3.msg4.should equal(:second)
31
31
  end
32
+
33
+ it "returns expected value from two chains with shared messages at the beginning" do
34
+ @subject.stub_chain(:msg1, :msg2, :msg3, :msg4).and_return(:first)
35
+ @subject.stub_chain(:msg1, :msg2, :msg3, :msg5).and_return(:second)
36
+
37
+ @subject.msg1.msg2.msg3.msg4.should equal(:first)
38
+ @subject.msg1.msg2.msg3.msg5.should equal(:second)
39
+ end
32
40
  end
33
41
  end
34
42
  end
@@ -0,0 +1,127 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module Mocks
5
+ describe Mock do
6
+ context "unstubbing a mock object with a stub" do
7
+ it "should remove the stub" do
8
+ a_mock = mock 'an object', :foo => :bar
9
+
10
+ a_mock.unstub! :foo
11
+ a_mock.should_not respond_to(:foo)
12
+ end
13
+ end
14
+
15
+ context "unstubbing a real object with a stub" do
16
+ before do
17
+ @obj = Object.new
18
+ end
19
+
20
+ it "should raise a NoMethodError if the message is called after unstubbing" do
21
+ @obj.stub!(:foo).and_return :bar
22
+ @obj.unstub!(:foo)
23
+
24
+ lambda {
25
+ @obj.foo
26
+ }.should raise_error(NoMethodError)
27
+ end
28
+
29
+ it "should only clear the stub specified" do
30
+ @obj.stub!(:foo).and_return :bar
31
+ @obj.stub!(:other).and_return :baz
32
+
33
+ @obj.unstub!(:foo)
34
+
35
+ @obj.other.should == :baz
36
+ end
37
+
38
+ it "should no longer respond_to? the method" do
39
+ @obj.stub!(:foo).and_return :bar
40
+ @obj.unstub!(:foo)
41
+
42
+ @obj.should_not respond_to(:foo)
43
+ end
44
+
45
+ it "should unstub using a string (should convert the string to a symbol)" do
46
+ @obj.stub!(:foo)
47
+
48
+ @obj.unstub!("foo")
49
+
50
+ @obj.should_not respond_to(:foo)
51
+ end
52
+
53
+ it "should restore a previous method definition" do
54
+ def @obj.foo
55
+ :a_result
56
+ end
57
+
58
+ @obj.stub!(:foo).and_return :stubbed_result
59
+ @obj.unstub!(:foo)
60
+
61
+ @obj.foo.should == :a_result
62
+ end
63
+
64
+ it "should have unstub as an alias of unstub!" do
65
+ @obj.stub!(:foo).and_return :bar
66
+
67
+ @obj.unstub(:foo)
68
+
69
+ lambda {
70
+ @obj.foo
71
+ }.should raise_error(NoMethodError)
72
+ end
73
+
74
+ it "should raise a MockExpectationError if it is not stubbed" do
75
+ lambda {
76
+ @obj.unstub!(:foo)
77
+ }.should raise_error(MockExpectationError, "The method `foo` was not stubbed or was already unstubbed")
78
+ end
79
+
80
+ it "should raise a MockExpectationError if it was already unstubbed" do
81
+ @obj.stub!(:foo)
82
+ @obj.unstub!(:foo)
83
+
84
+ lambda {
85
+ @obj.unstub!(:foo)
86
+ }.should raise_error(MockExpectationError, "The method `foo` was not stubbed or was already unstubbed")
87
+ end
88
+
89
+ it "should use the correct message name in the error" do
90
+ @obj.stub!(:bar)
91
+ @obj.unstub!(:bar)
92
+
93
+ lambda {
94
+ @obj.unstub!(:bar)
95
+ }.should raise_error(MockExpectationError, "The method `bar` was not stubbed or was already unstubbed")
96
+ end
97
+
98
+ it "should raise a MockExpectationError if the method is defined, but not stubbed" do
99
+ def @obj.meth; end
100
+
101
+ lambda {
102
+ @obj.unstub!(:meth)
103
+ }.should raise_error(MockExpectationError)
104
+ end
105
+
106
+ it "should be able to restub a after unstubbing" do
107
+ @obj.stub!(:foo).and_return :bar
108
+
109
+ @obj.unstub!(:foo)
110
+
111
+ @obj.stub!(:foo).and_return :baz
112
+
113
+ @obj.foo.should == :baz
114
+ end
115
+
116
+ it "should remove only the first stub if multiple stubs have been defined" do
117
+ @obj.stub!(:foo).and_return :first
118
+ @obj.stub!(:foo).and_return :second
119
+
120
+ @obj.unstub!(:foo)
121
+
122
+ @obj.foo.should == :first
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -255,7 +255,8 @@ a {
255
255
  <div class="failure" id="failure_5">
256
256
  <div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
257
257
  got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
258
- Diff:
258
+
259
+ Diff:
259
260
  @@ -1,4 +1,4 @@
260
261
  RSpec is a
261
262
  -behavior driven development
@@ -259,7 +259,8 @@ a {
259
259
  <div class="failure" id="failure_5">
260
260
  <div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
261
261
  got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
262
- Diff:
262
+
263
+ Diff:
263
264
  @@ -1,4 +1,4 @@
264
265
  RSpec is a
265
266
  -behavior driven development
@@ -265,7 +265,8 @@ a {
265
265
  <div class="failure" id="failure_5">
266
266
  <div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
267
267
  got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
268
- Diff:
268
+
269
+ Diff:
269
270
  @@ -1,4 +1,4 @@
270
271
  RSpec is a
271
272
  -behaviour driven development
@@ -265,7 +265,8 @@ a {
265
265
  <div class="failure" id="failure_5">
266
266
  <div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
267
267
  got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
268
- Diff:
268
+
269
+ Diff:
269
270
  @@ -1,4 +1,4 @@
270
271
  RSpec is a
271
272
  -behaviour driven development
@@ -270,7 +270,8 @@ a {
270
270
  <div class="failure" id="failure_5">
271
271
  <div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
272
272
  got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
273
- Diff:
273
+
274
+ Diff:
274
275
  @@ -1,4 +1,4 @@
275
276
  RSpec is a
276
277
  -behaviour driven development
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../../../spec_helper'
1
+ # require File.dirname(__FILE__) + '/../../../spec_helper'
2
2
 
3
3
  begin # See rescue all the way at the bottom
4
4
 
@@ -255,7 +255,8 @@ a {
255
255
  <div class="failure" id="failure_5">
256
256
  <div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
257
257
  got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
258
- Diff:
258
+
259
+ Diff:
259
260
  @@ -1,4 +1,4 @@
260
261
  RSpec is a
261
262
  -behavior driven development
@@ -261,7 +261,8 @@ a {
261
261
  <div class="failure" id="failure_5">
262
262
  <div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
263
263
  got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
264
- Diff:
264
+
265
+ Diff:
265
266
  @@ -1,4 +1,4 @@
266
267
  RSpec is a
267
268
  -behaviour driven development
@@ -261,7 +261,8 @@ a {
261
261
  <div class="failure" id="failure_5">
262
262
  <div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
263
263
  got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
264
- Diff:
264
+
265
+ Diff:
265
266
  @@ -1,4 +1,4 @@
266
267
  RSpec is a
267
268
  -behaviour driven development
@@ -266,7 +266,8 @@ a {
266
266
  <div class="failure" id="failure_5">
267
267
  <div class="message"><pre>expected: &quot;RSpec is a\nbehaviour driven development\nframework for Ruby\n&quot;,
268
268
  got: &quot;RSpec is a\nbehavior driven development\nframework for Ruby\n&quot; (using ==)
269
- Diff:
269
+
270
+ Diff:
270
271
  @@ -1,4 +1,4 @@
271
272
  RSpec is a
272
273
  -behaviour driven development
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.7
4
+ version: 1.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - RSpec Development Team
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-22 00:00:00 -05:00
12
+ date: 2009-07-16 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 2.1.0
33
+ version: 2.3.1
34
34
  version:
35
35
  description: Behaviour Driven Development for Ruby.
36
36
  email:
@@ -111,6 +111,7 @@ files:
111
111
  - features/example_groups/example_group_with_should_methods.feature
112
112
  - features/example_groups/implicit_docstrings.feature
113
113
  - features/example_groups/nested_groups.feature
114
+ - features/expectations/customized_message.feature
114
115
  - features/expectations/expect_change.feature
115
116
  - features/expectations/expect_error.feature
116
117
  - features/extensions/custom_example_group.feature
@@ -123,6 +124,7 @@ files:
123
124
  - features/matchers/define_diffable_matcher.feature
124
125
  - features/matchers/define_matcher.feature
125
126
  - features/matchers/define_matcher_outside_rspec.feature
127
+ - features/matchers/define_matcher_with_fluent_interface.feature
126
128
  - features/mock_framework_integration/use_flexmock.feature
127
129
  - features/mock_framework_integration/use_mocha.feature
128
130
  - features/mock_framework_integration/use_rr.feature
@@ -252,6 +254,7 @@ files:
252
254
  - lib/spec/runner/option_parser.rb
253
255
  - lib/spec/runner/options.rb
254
256
  - lib/spec/runner/reporter.rb
257
+ - lib/spec/stubs/cucumber.rb
255
258
  - lib/spec/test/unit.rb
256
259
  - lib/spec/version.rb
257
260
  - resources/helpers/cmdline.rb
@@ -285,7 +288,7 @@ files:
285
288
  - spec/spec/example/subclassing_example_group_spec.rb
286
289
  - spec/spec/example/subject_spec.rb
287
290
  - spec/spec/expectations/differs/default_spec.rb
288
- - spec/spec/expectations/extensions/object_spec.rb
291
+ - spec/spec/expectations/extensions/kernel_spec.rb
289
292
  - spec/spec/expectations/fail_with_spec.rb
290
293
  - spec/spec/expectations/handler_spec.rb
291
294
  - spec/spec/expectations/wrap_expectation_spec.rb
@@ -362,6 +365,7 @@ files:
362
365
  - spec/spec/mocks/stub_spec.rb
363
366
  - spec/spec/mocks/stubbed_message_expectations_spec.rb
364
367
  - spec/spec/mocks/twice_counts_spec.rb
368
+ - spec/spec/mocks/unstub_spec.rb
365
369
  - spec/spec/package/bin_spec_spec.rb
366
370
  - spec/spec/rake/spectask_spec.rb
367
371
  - spec/spec/runner/class_and_argument_parser_spec.rb
@@ -425,7 +429,7 @@ licenses: []
425
429
  post_install_message: |
426
430
  **************************************************
427
431
 
428
- Thank you for installing rspec-1.2.7
432
+ Thank you for installing rspec-1.2.8
429
433
 
430
434
  Please be sure to read History.rdoc and Upgrade.rdoc
431
435
  for useful information about this release.
@@ -455,6 +459,6 @@ rubyforge_project: rspec
455
459
  rubygems_version: 1.3.4
456
460
  signing_key:
457
461
  specification_version: 3
458
- summary: rspec 1.2.7
462
+ summary: rspec 1.2.8
459
463
  test_files: []
460
464