1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
module RSpec
module Core
module Pending
class PendingDeclaredInExample < StandardError; end
# If Test::Unit is loaed, we'll use its error as baseclass, so that Test::Unit
# will report unmet RSpec expectations as failures rather than errors.
begin
class PendingExampleFixedError < Test::Unit::AssertionFailedError; end
rescue
class PendingExampleFixedError < StandardError; end
end
NO_REASON_GIVEN = 'No reason given'
NOT_YET_IMPLEMENTED = 'Not yet implemented'
# @overload pending()
# @overload pending(message)
# @overload pending(message, &block)
#
# Stops execution of an example, and reports it as pending. Takes an
# optional message and block.
#
# @param [String] message optional message to add to the summary report.
# @param [Block] block optional block. If it fails, the example is
# reported as pending. If it executes cleanly the example fails.
#
# @example
#
# describe "an example" do
# # reported as "Pending: no reason given"
# it "is pending with no message" do
# pending
# this_does_not_get_executed
# end
#
# # reported as "Pending: something else getting finished"
# it "is pending with a custom message" do
# pending("something else getting finished")
# this_does_not_get_executed
# end
#
# # reported as "Pending: something else getting finished"
# it "is pending with a failing block" do
# pending("something else getting finished") do
# raise "this is the failure"
# end
# end
#
# # reported as failure, saying we expected the block to fail but
# # it passed.
# it "is pending with a passing block" do
# pending("something else getting finished") do
# true.should be(true)
# end
# end
# end
#
# @note `before(:each)` hooks are eval'd when you use the `pending`
# method within an example. If you want to declare an example `pending`
# and bypass the `before` hooks as well, you can pass `:pending => true`
# to the `it` method:
#
# it "does something", :pending => true do
# # ...
# end
#
# or pass `:pending => "something else getting finished"` to add a
# message to the summary report:
#
# it "does something", :pending => "something else getting finished" do
# # ...
# end
def pending(*args)
return self.class.before(:each) { pending(*args) } unless example
options = args.last.is_a?(Hash) ? args.pop : {}
message = args.first || NO_REASON_GIVEN
if options[:unless] || (options.has_key?(:if) && !options[:if])
return block_given? ? yield : nil
end
example.metadata[:pending] = true
example.metadata[:execution_result][:pending_message] = message
example.execution_result[:pending_fixed] = false
if block_given?
begin
result = begin
yield
example.example_group_instance.instance_eval { verify_mocks_for_rspec }
true
end
example.metadata[:pending] = false
rescue Exception => e
example.execution_result[:exception] = e
ensure
teardown_mocks_for_rspec
end
if result
example.execution_result[:pending_fixed] = true
raise PendingExampleFixedError.new
end
end
raise PendingDeclaredInExample.new(message)
end
end
# Alias the error for compatibility with extension gems (e.g. formatters)
# that depend on the const name of the error in RSpec <= 2.8.
PendingExampleFixedError = Pending::PendingExampleFixedError
end
end
|