rspec 1.1.3 → 1.1.4

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.
Files changed (122) hide show
  1. data/CHANGES +35 -0
  2. data/MIT-LICENSE +1 -1
  3. data/README +9 -44
  4. data/Rakefile +34 -51
  5. data/TODO +0 -1
  6. data/UPGRADE +0 -24
  7. data/bin/spec +0 -0
  8. data/bin/spec_translator +0 -0
  9. data/examples/pure/behave_as_example.rb +0 -0
  10. data/examples/pure/partial_mock_example.rb +1 -0
  11. data/examples/stories/calculator.rb +1 -1
  12. data/lib/autotest/rspec.rb +7 -9
  13. data/lib/spec/example.rb +1 -1
  14. data/lib/spec/example/configuration.rb +30 -16
  15. data/lib/spec/example/example_group.rb +2 -1
  16. data/lib/spec/example/example_group_factory.rb +23 -21
  17. data/lib/spec/example/example_group_methods.rb +18 -5
  18. data/lib/spec/example/example_matcher.rb +0 -0
  19. data/lib/spec/example/example_methods.rb +6 -0
  20. data/lib/spec/example/module_inclusion_warnings.rb +37 -0
  21. data/lib/spec/expectations/differs/default.rb +1 -1
  22. data/lib/spec/expectations/extensions/object.rb +4 -12
  23. data/lib/spec/expectations/handler.rb +8 -0
  24. data/lib/spec/extensions.rb +1 -0
  25. data/lib/spec/extensions/metaclass.rb +7 -0
  26. data/lib/spec/extensions/object.rb +0 -4
  27. data/lib/spec/matchers/change.rb +1 -1
  28. data/lib/spec/matchers/has.rb +1 -11
  29. data/lib/spec/matchers/operator_matcher.rb +0 -0
  30. data/lib/spec/matchers/raise_error.rb +53 -30
  31. data/lib/spec/mocks.rb +1 -1
  32. data/lib/spec/mocks/argument_constraint_matchers.rb +5 -1
  33. data/lib/spec/mocks/argument_expectation.rb +26 -0
  34. data/lib/spec/mocks/extensions.rb +1 -0
  35. data/lib/spec/mocks/framework.rb +15 -0
  36. data/lib/spec/mocks/message_expectation.rb +29 -5
  37. data/lib/spec/mocks/mock.rb +9 -7
  38. data/lib/spec/mocks/proxy.rb +26 -12
  39. data/lib/spec/rake/spectask.rb +5 -5
  40. data/lib/spec/runner/backtrace_tweaker.rb +1 -1
  41. data/lib/spec/runner/formatter/base_formatter.rb +2 -3
  42. data/lib/spec/runner/formatter/base_text_formatter.rb +2 -2
  43. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +4 -8
  44. data/lib/spec/runner/formatter/html_formatter.rb +18 -14
  45. data/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
  46. data/lib/spec/runner/formatter/profile_formatter.rb +4 -0
  47. data/lib/spec/runner/formatter/progress_bar_formatter.rb +5 -1
  48. data/lib/spec/runner/formatter/specdoc_formatter.rb +1 -1
  49. data/lib/spec/runner/formatter/story/plain_text_formatter.rb +18 -7
  50. data/lib/spec/runner/option_parser.rb +17 -15
  51. data/lib/spec/runner/options.rb +37 -14
  52. data/lib/spec/runner/reporter.rb +15 -11
  53. data/lib/spec/story/extensions/regexp.rb +2 -2
  54. data/lib/spec/story/extensions/string.rb +2 -2
  55. data/lib/spec/story/runner.rb +9 -5
  56. data/lib/spec/story/runner/plain_text_story_runner.rb +2 -2
  57. data/lib/spec/story/runner/scenario_runner.rb +8 -0
  58. data/lib/spec/story/runner/story_mediator.rb +1 -1
  59. data/lib/spec/story/runner/story_runner.rb +3 -1
  60. data/lib/spec/story/step.rb +4 -4
  61. data/lib/spec/story/story.rb +8 -11
  62. data/lib/spec/story/world.rb +0 -1
  63. data/lib/spec/version.rb +2 -2
  64. data/plugins/mock_frameworks/rspec.rb +2 -0
  65. data/spec/autotest/rspec_spec.rb +12 -10
  66. data/spec/spec/example/configuration_spec.rb +0 -0
  67. data/spec/spec/example/example_group/described_module_spec.rb +20 -0
  68. data/spec/spec/example/example_group/warning_messages_spec.rb +76 -0
  69. data/spec/spec/example/example_group_factory_spec.rb +117 -102
  70. data/spec/spec/example/example_group_methods_spec.rb +51 -17
  71. data/spec/spec/example/example_group_spec.rb +13 -1
  72. data/spec/spec/example/example_methods_spec.rb +28 -6
  73. data/spec/spec/example/nested_example_group_spec.rb +12 -0
  74. data/spec/spec/example/predicate_matcher_spec.rb +0 -0
  75. data/spec/spec/expectations/differs/default_spec.rb +27 -9
  76. data/spec/spec/matchers/be_spec.rb +24 -0
  77. data/spec/spec/matchers/has_spec.rb +16 -0
  78. data/spec/spec/matchers/raise_error_spec.rb +124 -0
  79. data/spec/spec/mocks/{bug_report_10263.rb → bug_report_10263_spec.rb} +0 -0
  80. data/spec/spec/mocks/bug_report_11545_spec.rb +2 -0
  81. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +8 -0
  82. data/spec/spec/mocks/hash_including_matcher_spec.rb +32 -0
  83. data/spec/spec/mocks/mock_spec.rb +56 -37
  84. data/spec/spec/mocks/partial_mock_spec.rb +41 -5
  85. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +6 -0
  86. data/spec/spec/runner/execution_context_spec.rb +7 -1
  87. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +3 -2
  88. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +30 -25
  89. data/spec/spec/runner/formatter/html_formatter_spec.rb +0 -3
  90. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +333 -0
  91. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +12 -2
  92. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +2 -2
  93. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +110 -78
  94. data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +105 -1
  95. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +33 -28
  96. data/spec/spec/runner/option_parser_spec.rb +65 -49
  97. data/spec/spec/runner/options_spec.rb +103 -17
  98. data/spec/spec/runner/reporter_spec.rb +10 -7
  99. data/spec/spec/runner/spec_drb.opts +1 -0
  100. data/spec/spec/runner/spec_parser_spec.rb +10 -4
  101. data/spec/spec/story/runner/plain_text_story_runner_spec.rb +14 -13
  102. data/spec/spec/story/runner/scenario_runner_spec.rb +124 -52
  103. data/spec/spec/story/runner/story_mediator_spec.rb +2 -2
  104. data/spec/spec/story/runner/story_runner_spec.rb +40 -2
  105. data/spec/spec/story/runner_spec.rb +59 -72
  106. data/spec/spec/story/step_spec.rb +20 -1
  107. data/spec/spec/story/story_spec.rb +2 -2
  108. data/stories/all.rb +1 -1
  109. data/stories/example_groups/stories.rb +4 -3
  110. data/stories/mock_framework_integration/stories.rb +7 -0
  111. data/stories/mock_framework_integration/use_flexmock.story +9 -0
  112. data/stories/resources/spec/spec_with_flexmock.rb +18 -0
  113. metadata +21 -18
  114. data/pre_commit/lib/pre_commit.rb +0 -4
  115. data/pre_commit/lib/pre_commit/core.rb +0 -50
  116. data/pre_commit/lib/pre_commit/pre_commit.rb +0 -54
  117. data/pre_commit/lib/pre_commit/rspec.rb +0 -111
  118. data/pre_commit/lib/pre_commit/rspec_on_rails.rb +0 -313
  119. data/pre_commit/spec/pre_commit/pre_commit_spec.rb +0 -15
  120. data/pre_commit/spec/pre_commit/rspec_on_rails_spec.rb +0 -36
  121. data/pre_commit/spec/spec_helper.rb +0 -3
  122. data/pre_commit/spec/spec_suite.rb +0 -11
@@ -1,6 +1,7 @@
1
1
  module Spec
2
2
  module Example
3
- # The superclass for all regular RSpec examples.
3
+ # Base class for customized example groups. Use this if you
4
+ # want to make a custom example group.
4
5
  class ExampleGroup
5
6
  extend Spec::Example::ExampleGroupMethods
6
7
  include Spec::Example::ExampleMethods
@@ -7,52 +7,54 @@ module Spec
7
7
  default(ExampleGroup)
8
8
  end
9
9
 
10
- # Registers an example group class +klass+ with the symbol
11
- # +type+. For example:
10
+ # Registers an example group class +klass+ with the symbol +type+. For
11
+ # example:
12
12
  #
13
- # Spec::Example::ExampleGroupFactory.register(:farm, Spec::Farm::Example::FarmExampleGroup)
13
+ # Spec::Example::ExampleGroupFactory.register(:farm, FarmExampleGroup)
14
14
  #
15
- # This will cause Main#describe from a file living in
16
- # <tt>spec/farm</tt> to create example group instances of type
17
- # Spec::Farm::Example::FarmExampleGroup.
18
- def register(id, example_group_class)
19
- @example_group_types[id] = example_group_class
15
+ # With that you can append a hash with :type => :farm to the describe
16
+ # method and it will load an instance of FarmExampleGroup.
17
+ #
18
+ # describe Pig, :type => :farm do
19
+ # ...
20
+ #
21
+ # If you don't use the hash explicitly, <tt>describe</tt> will
22
+ # implicitly use an instance of FarmExampleGroup for any file loaded
23
+ # from the <tt>./spec/farm</tt> directory.
24
+ def register(key, example_group_class)
25
+ @example_group_types[key] = example_group_class
20
26
  end
21
27
 
22
28
  # Sets the default ExampleGroup class
23
29
  def default(example_group_class)
24
30
  old = @example_group_types
25
31
  @example_group_types = Hash.new(example_group_class)
26
- @example_group_types.merge(old) if old
32
+ @example_group_types.merge!(old) if old
27
33
  end
28
34
 
29
- def get(id=nil)
30
- if @example_group_types.values.include?(id)
31
- id
35
+ def get(key=nil)
36
+ if @example_group_types.values.include?(key)
37
+ key
32
38
  else
33
- @example_group_types[id]
39
+ @example_group_types[key]
34
40
  end
35
41
  end
36
42
 
37
43
  def create_example_group(*args, &block)
38
44
  opts = Hash === args.last ? args.last : {}
39
- if opts[:shared]
40
- SharedExampleGroup.new(*args, &block)
41
- else
42
- superclass = determine_superclass(opts)
43
- superclass.describe(*args, &block)
44
- end
45
+ superclass = determine_superclass(opts)
46
+ superclass.describe(*args, &block)
45
47
  end
46
48
 
47
49
  protected
48
50
 
49
51
  def determine_superclass(opts)
50
- id = if opts[:type]
52
+ key = if opts[:type]
51
53
  opts[:type]
52
54
  elsif opts[:spec_path] =~ /spec(\\|\/)(#{@example_group_types.keys.join('|')})/
53
55
  $2 == '' ? nil : $2.to_sym
54
56
  end
55
- get(id)
57
+ get(key)
56
58
  end
57
59
 
58
60
  end
@@ -34,10 +34,17 @@ module Spec
34
34
  # end
35
35
  #
36
36
  def describe(*args, &example_group_block)
37
+ args << {} unless Hash === args.last
37
38
  if example_group_block
38
- self.subclass("Subclass") do
39
- describe(*args)
40
- module_eval(&example_group_block)
39
+ params = args.last
40
+ params[:spec_path] = eval("caller(0)[1]", example_group_block) unless params[:spec_path]
41
+ if params[:shared]
42
+ SharedExampleGroup.new(*args, &example_group_block)
43
+ else
44
+ self.subclass("Subclass") do
45
+ describe(*args)
46
+ module_eval(&example_group_block)
47
+ end
41
48
  end
42
49
  else
43
50
  set_description(*args)
@@ -45,6 +52,7 @@ module Spec
45
52
  self
46
53
  end
47
54
  end
55
+ alias :context :describe
48
56
 
49
57
  # Use this to pull in examples from shared example groups.
50
58
  # See Spec::Runner for information about shared example groups.
@@ -107,11 +115,12 @@ module Spec
107
115
  def xit(description=nil, opts={}, &block)
108
116
  Kernel.warn("Example disabled: #{description}")
109
117
  end
118
+ alias_method :xspecify, :xit
110
119
 
111
120
  def run
112
121
  examples = examples_to_run
113
- return true if examples.empty?
114
122
  reporter.add_example_group(self)
123
+ return true if examples.empty?
115
124
  return dry_run(examples) if dry_run?
116
125
 
117
126
  plugin_mock_framework
@@ -150,10 +159,12 @@ module Spec
150
159
  @description_text = ExampleGroupMethods.description_text(*args)
151
160
  @spec_path = File.expand_path(options[:spec_path]) if options[:spec_path]
152
161
  if described_type.class == Module
153
- include described_type
162
+ @described_module = described_type
154
163
  end
155
164
  self
156
165
  end
166
+
167
+ attr_reader :described_module
157
168
 
158
169
  def examples #:nodoc:
159
170
  examples = example_objects.dup
@@ -384,6 +395,7 @@ module Spec
384
395
  case scope
385
396
  when :each; before_each_parts
386
397
  when :all; before_all_parts
398
+ when :suite; rspec_options.before_suite_parts
387
399
  end
388
400
  end
389
401
 
@@ -391,6 +403,7 @@ module Spec
391
403
  case scope
392
404
  when :each; after_each_parts
393
405
  when :all; after_all_parts
406
+ when :suite; rspec_options.after_suite_parts
394
407
  end
395
408
  end
396
409
 
File without changes
@@ -3,6 +3,8 @@ module Spec
3
3
  module ExampleMethods
4
4
  extend ExampleGroupMethods
5
5
  extend ModuleReopeningFix
6
+ include ModuleInclusionWarnings
7
+
6
8
 
7
9
  PENDING_EXAMPLE_BLOCK = lambda {
8
10
  raise Spec::Example::ExamplePendingError.new("Not Yet Implemented")
@@ -63,6 +65,10 @@ module Spec
63
65
  def description
64
66
  @_defined_description || @_matcher_description || "NO NAME"
65
67
  end
68
+
69
+ def __full_description
70
+ "#{self.class.description} #{self.description}"
71
+ end
66
72
 
67
73
  def set_instance_variables_from_hash(ivars)
68
74
  ivars.each do |variable_name, value|
@@ -0,0 +1,37 @@
1
+ module Spec
2
+ module Example
3
+ # In the future, modules will no longer be automatically included
4
+ # in the Example Group (based on the description name); when that
5
+ # time comes, this code should be removed.
6
+ module ModuleInclusionWarnings
7
+ # Thanks, Francis Hwang.
8
+ class MethodDispatcher
9
+ def initialize(mod, target=nil)
10
+ @mod = mod
11
+ @target = target
12
+ end
13
+
14
+ def respond_to?(sym)
15
+ @mod && @mod.instance_methods.include?(sym.to_s)
16
+ end
17
+
18
+ def call(sym, *args, &blk)
19
+ Kernel.warn("Modules will no longer be automatically included in RSpec version 1.1.4. Called from #{caller[2]}")
20
+ @target.extend @mod
21
+ @target.send(sym, *args, &blk)
22
+ end
23
+ end
24
+
25
+ def respond_to?(sym)
26
+ MethodDispatcher.new(self.class.described_module).respond_to?(sym) ? true : super
27
+ end
28
+
29
+ private
30
+
31
+ def method_missing(sym, *args, &blk)
32
+ md = MethodDispatcher.new(self.class.described_module, self)
33
+ self.respond_to?(sym) ? md.call(sym, *args, &blk) : super
34
+ end
35
+ end
36
+ end
37
+ end
@@ -17,7 +17,7 @@ module Spec
17
17
  end
18
18
 
19
19
  # This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)
20
- def diff_as_string(data_old, data_new)
20
+ def diff_as_string(data_new, data_old)
21
21
  data_old = data_old.split(/\n/).map! { |e| e.chomp }
22
22
  data_new = data_new.split(/\n/).map! { |e| e.chomp }
23
23
  output = ""
@@ -27,12 +27,8 @@ module Spec
27
27
  #
28
28
  # NOTE that this does NOT support receiver.should != expected.
29
29
  # Instead, use receiver.should_not == expected
30
- def should(matcher = :default_parameter, &block)
31
- if :default_parameter == matcher
32
- Spec::Matchers::PositiveOperatorMatcher.new(self)
33
- else
34
- ExpectationMatcherHandler.handle_matcher(self, matcher, &block)
35
- end
30
+ def should(matcher=:use_operator_matcher, &block)
31
+ ExpectationMatcherHandler.handle_matcher(self, matcher, &block)
36
32
  end
37
33
 
38
34
  # :call-seq:
@@ -54,12 +50,8 @@ module Spec
54
50
  # => Passes unless (receiver =~ regexp)
55
51
  #
56
52
  # See Spec::Matchers for more information about matchers
57
- def should_not(matcher = :default_parameter, &block)
58
- if :default_parameter == matcher
59
- Spec::Matchers::NegativeOperatorMatcher.new(self)
60
- else
61
- NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block)
62
- end
53
+ def should_not(matcher=:use_operator_matcher, &block)
54
+ NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block)
63
55
  end
64
56
 
65
57
  end
@@ -12,6 +12,10 @@ module Spec
12
12
  class << self
13
13
  include MatcherHandlerHelper
14
14
  def handle_matcher(actual, matcher, &block)
15
+ if :use_operator_matcher == matcher
16
+ return Spec::Matchers::PositiveOperatorMatcher.new(actual)
17
+ end
18
+
15
19
  unless matcher.respond_to?(:matches?)
16
20
  raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}."
17
21
  end
@@ -27,6 +31,10 @@ module Spec
27
31
  class << self
28
32
  include MatcherHandlerHelper
29
33
  def handle_matcher(actual, matcher, &block)
34
+ if :use_operator_matcher == matcher
35
+ return Spec::Matchers::NegativeOperatorMatcher.new(actual)
36
+ end
37
+
30
38
  unless matcher.respond_to?(:matches?)
31
39
  raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}."
32
40
  end
@@ -1,3 +1,4 @@
1
1
  require 'spec/extensions/object'
2
2
  require 'spec/extensions/class'
3
3
  require 'spec/extensions/main'
4
+ require 'spec/extensions/metaclass'
@@ -0,0 +1,7 @@
1
+ module Spec
2
+ module MetaClass
3
+ def metaclass
4
+ class << self; self; end
5
+ end
6
+ end
7
+ end
@@ -3,8 +3,4 @@ class Object
3
3
  options = Hash === args.last ? args.pop : {}
4
4
  return args, options
5
5
  end
6
-
7
- def metaclass
8
- class << self; self; end
9
- end
10
6
  end
@@ -114,7 +114,7 @@ EOF
114
114
  #
115
115
  # string = "string"
116
116
  # lambda {
117
- # string.reverse
117
+ # string.reverse!
118
118
  # }.should change { string }.from("string").to("gnirts")
119
119
  #
120
120
  # lambda {
@@ -8,24 +8,14 @@ module Spec
8
8
  end
9
9
 
10
10
  def matches?(target)
11
- @target = target
12
- begin
13
- return target.send(predicate, *@args)
14
- rescue => @error
15
- # This clause should be empty, but rcov will not report it as covered
16
- # unless something (anything) is executed within the clause
17
- rcov_error_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0"
18
- end
19
- return false
11
+ target.send(predicate, *@args)
20
12
  end
21
13
 
22
14
  def failure_message
23
- raise @error if @error
24
15
  "expected ##{predicate}(#{@args[0].inspect}) to return true, got false"
25
16
  end
26
17
 
27
18
  def negative_failure_message
28
- raise @error if @error
29
19
  "expected ##{predicate}(#{@args[0].inspect}) to return false, got true"
30
20
  end
31
21
 
File without changes
@@ -1,54 +1,66 @@
1
1
  module Spec
2
2
  module Matchers
3
-
4
3
  class RaiseError #:nodoc:
5
- def initialize(error_or_message=Exception, message=nil)
6
- if String === error_or_message
7
- @expected_error = Exception
8
- @expected_message = error_or_message
4
+ def initialize(error_or_message=Exception, message=nil, &block)
5
+ @block = block
6
+ case error_or_message
7
+ when String, Regexp
8
+ @expected_error, @expected_message = Exception, error_or_message
9
9
  else
10
- @expected_error = error_or_message
11
- @expected_message = message
10
+ @expected_error, @expected_message = error_or_message, message
12
11
  end
13
12
  end
14
-
13
+
15
14
  def matches?(proc)
16
15
  @raised_expected_error = false
17
- @raised_other = false
16
+ @with_expected_message = false
17
+ @eval_block = false
18
+ @eval_block_passed = false
18
19
  begin
19
20
  proc.call
20
21
  rescue @expected_error => @actual_error
21
- if @expected_message.nil?
22
- @raised_expected_error = true
23
- else
24
- verify_message
25
- end
22
+ @raised_expected_error = true
23
+ @with_expected_message = verify_message
26
24
  rescue Exception => @actual_error
27
- @raised_other = true
28
- ensure
29
- return @raised_expected_error
25
+ # This clause should be empty, but rcov will not report it as covered
26
+ # unless something (anything) is executed within the clause
27
+ rcov_error_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0"
28
+ end
29
+
30
+ unless negative_expectation?
31
+ eval_block if @raised_expected_error && @with_expected_message && @block
32
+ end
33
+ ensure
34
+ return (@raised_expected_error && @with_expected_message) ? (@eval_block ? @eval_block_passed : true) : false
35
+ end
36
+
37
+ def eval_block
38
+ @eval_block = true
39
+ begin
40
+ @block[@actual_error]
41
+ @eval_block_passed = true
42
+ rescue Exception => err
43
+ @actual_error = err
30
44
  end
31
45
  end
32
46
 
33
47
  def verify_message
34
48
  case @expected_message
49
+ when nil
50
+ return true
35
51
  when Regexp
36
- if @expected_message =~ @actual_error.message
37
- @raised_expected_error = true
38
- else
39
- @raised_other = true
40
- end
52
+ return @expected_message =~ @actual_error.message
41
53
  else
42
- if @expected_message == @actual_error.message
43
- @raised_expected_error = true
44
- else
45
- @raised_other = true
46
- end
54
+ return @expected_message == @actual_error.message
47
55
  end
48
56
  end
49
57
 
50
58
  def failure_message
51
- return "expected #{expected_error}#{actual_error}" if @raised_other || !@raised_expected_error
59
+ if @eval_block
60
+ return @actual_error.message
61
+ else
62
+ return "expected #{expected_error}#{actual_error}"
63
+ end
52
64
  end
53
65
 
54
66
  def negative_failure_message
@@ -74,6 +86,11 @@ module Spec
74
86
  def actual_error
75
87
  @actual_error.nil? ? " but nothing was raised" : ", got #{@actual_error.inspect}"
76
88
  end
89
+
90
+ def negative_expectation?
91
+ # YES - I'm a bad person... help me find a better way - ryand
92
+ caller.first(3).find { |s| s =~ /should_not/ }
93
+ end
77
94
  end
78
95
 
79
96
  # :call-seq:
@@ -81,6 +98,10 @@ module Spec
81
98
  # should raise_error(NamedError)
82
99
  # should raise_error(NamedError, String)
83
100
  # should raise_error(NamedError, Regexp)
101
+ # should raise_error() { |error| ... }
102
+ # should raise_error(NamedError) { |error| ... }
103
+ # should raise_error(NamedError, String) { |error| ... }
104
+ # should raise_error(NamedError, Regexp) { |error| ... }
84
105
  # should_not raise_error()
85
106
  # should_not raise_error(NamedError)
86
107
  # should_not raise_error(NamedError, String)
@@ -90,11 +111,13 @@ module Spec
90
111
  # With a named error, matches only if that specific error is raised.
91
112
  # With a named error and messsage specified as a String, matches only if both match.
92
113
  # With a named error and messsage specified as a Regexp, matches only if both match.
114
+ # Pass an optional block to perform extra verifications on the exception matched
93
115
  #
94
116
  # == Examples
95
117
  #
96
118
  # lambda { do_something_risky }.should raise_error
97
119
  # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError)
120
+ # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError) { |error| error.data.should == 42 }
98
121
  # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, "that was too risky")
99
122
  # lambda { do_something_risky }.should raise_error(PoorRiskDecisionError, /oo ri/)
100
123
  #
@@ -102,8 +125,8 @@ module Spec
102
125
  # lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError)
103
126
  # lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, "that was too risky")
104
127
  # lambda { do_something_risky }.should_not raise_error(PoorRiskDecisionError, /oo ri/)
105
- def raise_error(error=Exception, message=nil)
106
- Matchers::RaiseError.new(error, message)
128
+ def raise_error(error=Exception, message=nil, &block)
129
+ Matchers::RaiseError.new(error, message, &block)
107
130
  end
108
131
  end
109
132
  end