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
|
require 'rr'
module Riot
# Enables inherent RR support in Riot. When required in, all contexts and assertions are adapted to have
# RR support.
module RR
# Basically, provides a {Riot::Situation} that has been adapted to RR. This means that any of the
# RR methods that would typically be used: +mock+, +stub+, +verify+, etc. will be available to any
# setup, yeardown, helper, hookup, or assertion.
class Situation < Riot::Situation
include ::RR::Adapters::RRMethods
def initialize
self.reset
super
end
end # Situation
# Binds the {Riot::Assertion} to RR so that successes and failures found by RR are inherently handled
# during an assertion evaluation. In effect, if RR suggests failure during validation, the assertion
# will fail and report these failures.
class Assertion < Riot::Assertion
# Adds RR support to {Riot::Assertion#run}. The basic flow is to:
# * run the test as normal
# * ask RR to verify mock results
# * report any errors or return the result of the assertion as normal
# * reset RR so that the next assertion in the context can be verified cleanly.
#
# @param (see Riot::Assertion#run)
# @return (see Riot::Assertion#run)
def run(situation)
result = super
situation.verify
result
rescue ::RR::Errors::RRError => e
result.first == :pass ? [:fail, e.message.gsub(/\n/, " ")] : result
ensure
situation.reset
end
end # Assertion
# Redefines the classes {Riot::Context} will use when creating new assertions and situations to be the
# ones provided RR support. See {Riot::RR::Assertion} and {Riot::RR::Situation}.
module ContextClassOverrides
# (see Riot::ContextClassOverrides#assertion_class)
def assertion_class; Riot::RR::Assertion; end
# (see Riot::ContextClassOverrides#situation_class)
def situation_class; Riot::RR::Situation; end
end # ContextClassOverrides
# A convenience method for telling {Riot::RR::ContextClassOverrides} to mix itself into {Riot::Context}.
# Thus, enabling RR support in Riot.
#
# @param [Class] context_class the class representing the Context to bind to
def self.enable(context_class)
context_class.instance_eval { include Riot::RR::ContextClassOverrides }
end
end # RR
end # Riot
Riot::RR.enable(Riot::Context)
|