def fail failure = {}
      return unless failure
      unless failure.is_a?(Hash)
        failure || raise(ArgumentError, 'Please provide a failure message')
        failure = {message: failure}
      end
      @__ms__failures << failure.merge(callers: @__ms__callers)
      throw :__ms__stop_evaluation unless self.class.continue_on_failures?
    end
def fail failure = {}
      return unless failure
      unless failure.is_a?(Hash)
        failure || raise(ArgumentError, 'Please provide a failure message')
        failure = {message: failure}
      end
      @__ms__failures << failure.merge(callers: @__ms__callers)
      throw :__ms__stop_evaluation unless self.class.continue_on_failures?
    end
adds a new failure to the stack.
 a failure is a Hash containing keys like
   :message
   :left_method
   :left_object
   :right_method
   :right_object
   :negation
   :callers
 used by MiniSpec::Run#failures_summary and MiniSpecRun#failure_message
 to output useful info about failed tests.

 @param failure  if failure is `nil` or `false` it simply returns.
                 unless failure is a Hash it is building a Hash like
                 {message: failure} and adding it to the stack.
 @return [Array] failures stack