class RSpec::Mocks::ErrorGenerator

@private

Attributes

opts[W]

Public Class Methods

new(target, name) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 39
def initialize(target, name)
  @target = target
  @name = name
end
raise_double_negation_error(wrapped_expression) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 217
def self.raise_double_negation_error(wrapped_expression)
  raise "Isn't life confusing enough? You've already set a "                "negative message expectation and now you are trying to "                "negate it again with `never`. What does an expression like "                "`#{wrapped_expression}.not_to receive(:msg).never` even mean?"
end

Public Instance Methods

actual_method_call_args_description(count, args) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 147
def actual_method_call_args_description(count, args)
  method_call_args_description(args) ||
    if count > 0 && args.length > 0
      " with arguments: #{args.inspect.gsub(/\A\[(.+)\]\z/, '(\1)')}"
    else
      ""
    end
end
default_error_message(expectation, expected_args, actual_args) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 87
def default_error_message(expectation, expected_args, actual_args)
  [
    intro,
    "received",
    expectation.message.inspect,
    unexpected_arguments_message(expected_args, actual_args),
  ].join(" ")
end
describe_expectation(verb, message, expected_received_count, _actual_received_count, *args) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 175
def describe_expectation(verb, message, expected_received_count, _actual_received_count, *args)
  "#{verb} #{message}#{format_args(*args)} #{count_message(expected_received_count)}"
end
expected_method_call_args_description(args) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 157
def expected_method_call_args_description(args)
  method_call_args_description(args) ||
    if args.length > 0
      " with arguments: #{format_args(*args)}"
    else
      ""
    end
end
expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 141
def expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher)
  "expected: #{count_message(expected_received_count, expectation_count_type)}" +
    expected_method_call_args_description(argument_list_matcher.expected_args)
end
method_call_args_description(args) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 167
def method_call_args_description(args)
  case args.first
  when ArgumentMatchers::AnyArgsMatcher then " with any arguments"
  when ArgumentMatchers::NoArgsMatcher  then " with no arguments"
  end
end
opts() click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 45
def opts
  @opts ||= {}
end
raise_block_failed_error(message, detail) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 185
def raise_block_failed_error(message, detail)
  __raise "#{intro} received :#{message} but passed block failed with: #{detail}"
end
raise_expectation_error(message, expected_received_count, argument_list_matcher, actual_received_count, expectation_count_type, *args) click to toggle source

rubocop:disable Style/ParameterLists @private

# File lib/rspec/mocks/error_generator.rb, line 98
def raise_expectation_error(message, expected_received_count, argument_list_matcher, actual_received_count, expectation_count_type, *args)
  expected_part = expected_part_of_expectation_error(expected_received_count, expectation_count_type, argument_list_matcher)
  received_part = received_part_of_expectation_error(actual_received_count, *args)
  __raise "(#{intro}).#{message}#{format_args(*args)}\n    #{expected_part}\n    #{received_part}"
end
raise_expectation_on_mocked_method(method) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 212
def raise_expectation_on_mocked_method(method)
  __raise "#{intro} expected to have received #{method}, but that "                  "method has been mocked instead of stubbed or spied."
end
raise_expectation_on_unstubbed_method(method) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 206
def raise_expectation_on_unstubbed_method(method)
  __raise "#{intro} expected to have received #{method}, but that "                  "object is not a spy or method has not been stubbed."
end
raise_expired_test_double_error() click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 126
def raise_expired_test_double_error
  raise ExpiredTestDoubleError,
        "#{intro} was originally created in one example but has leaked into "                "another example and can no longer be used. rspec-mocks' doubles are "                "designed to only last for one example, and you need to create a new "                "one in each example you wish to use it for."
end
raise_invalid_arguments_error(verifier) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 121
def raise_invalid_arguments_error(verifier)
  __raise verifier.error_message
end
raise_missing_block_error(args_to_yield) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 190
def raise_missing_block_error(args_to_yield)
  __raise "#{intro} asked to yield |#{arg_list(*args_to_yield)}| but no block was passed"
end
raise_missing_default_stub_error(expectation, *args) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 67
def raise_missing_default_stub_error(expectation, *args)
  expected_args = format_args(*expectation.expected_args)
  actual_args = format_received_args(*args)
  diff = diff_message(expectation.expected_args, args)

  message = default_error_message(expectation, expected_args, actual_args)
  message << "\nDiff:\n #{diff}" unless diff.empty?
  message << "\n Please stub a default value first if message might be received with other args as well. \n"

  __raise message
end
raise_non_public_error(method_name, visibility) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 114
def raise_non_public_error(method_name, visibility)
  raise NoMethodError, "%s method `%s' called on %s" % [
    visibility, method_name, intro
  ]
end
raise_only_valid_on_a_partial_double(method) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 200
def raise_only_valid_on_a_partial_double(method)
  __raise "#{intro} is a pure test double. `#{method}` is only "                  "available on a partial double."
end
raise_out_of_order_error(message) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 180
def raise_out_of_order_error(message)
  __raise "#{intro} received :#{message} out of order"
end
raise_similar_message_args_error(expectation, *args_for_multiple_calls) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 80
def raise_similar_message_args_error(expectation, *args_for_multiple_calls)
  expected_args = format_args(*expectation.expected_args)
  actual_args = args_for_multiple_calls.map { |a| format_received_args(*a) }.join(", ")

  __raise(default_error_message(expectation, expected_args, actual_args))
end
raise_unexpected_message_args_error(expectation, *args) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 55
def raise_unexpected_message_args_error(expectation, *args)
  expected_args = format_args(*expectation.expected_args)
  actual_args = format_received_args(*args)
  diff = diff_message(expectation.expected_args, args)

  message = default_error_message(expectation, expected_args, actual_args)
  message << "\nDiff:#{diff}" unless diff.empty?

  __raise message
end
raise_unexpected_message_error(message, *args) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 50
def raise_unexpected_message_error(message, *args)
  __raise "#{intro} received unexpected message :#{message}#{arg_message(*args)}"
end
raise_unimplemented_error(doubled_module, method_name) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 106
def raise_unimplemented_error(doubled_module, method_name)
  __raise "%s does not implement: %s" % [
    doubled_module.description,
    method_name
  ]
end
raise_wrong_arity_error(args_to_yield, signature) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 195
def raise_wrong_arity_error(args_to_yield, signature)
  __raise "#{intro} yielded |#{arg_list(*args_to_yield)}| to block with #{signature.description}"
end
received_part_of_expectation_error(actual_received_count, *args) click to toggle source

@private

# File lib/rspec/mocks/error_generator.rb, line 135
def received_part_of_expectation_error(actual_received_count, *args)
  "received: #{count_message(actual_received_count)}" +
    actual_method_call_args_description(actual_received_count, args)
end

Private Instance Methods

__raise(message) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 270
def __raise(message)
  message = opts[:message] unless opts[:message].nil?
  Kernel.raise(RSpec::Mocks::MockExpectationError, message)
end
arg_has_valid_description?(arg) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 287
def arg_has_valid_description?(arg)
  RSpec::Support.is_a_matcher?(arg) && arg.respond_to?(:description)
end
arg_list(*args) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 283
def arg_list(*args)
  args.map { |arg| arg_has_valid_description?(arg) ? arg.description : arg.inspect }.join(", ")
end
arg_message(*args) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 275
def arg_message(*args)
  " with " + format_args(*args)
end
count_message(count, expectation_count_type=nil) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 299
def count_message(count, expectation_count_type=nil)
  return "at least #{times(count.abs)}" if count < 0 || expectation_count_type == :at_least
  return "at most #{times(count)}" if expectation_count_type == :at_most
  times(count)
end
diff_message(expected_args, actual_args) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 230
def diff_message(expected_args, actual_args)
  formatted_expected_args = expected_args.map do |x|
    RSpec::Support.rspec_description_for_object(x)
  end

  formatted_expected_args, actual_args = unpack_string_args(formatted_expected_args, actual_args)

  differ.diff(actual_args, formatted_expected_args)
end
differ() click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 252
def differ
  RSpec::Support::Differ.new(:color => RSpec::Mocks.configuration.color?)
end
format_args(*args) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 279
def format_args(*args)
  args.empty? ? "(no args)" : "(" + arg_list(*args) + ")"
end
format_received_args(*args) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 291
def format_received_args(*args)
  args.empty? ? "(no args)" : "(" + received_arg_list(*args) + ")"
end
intro() click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 256
def intro
  if @name
    "Double #{@name.inspect}"
  elsif TestDouble === @target
    "Double"
  elsif Class === @target
    "<#{@target.inspect} (class)>"
  elsif @target
    @target
  else
    "nil"
  end
end
list_of_exactly_one_string?(args) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 248
def list_of_exactly_one_string?(args)
  Array === args && args.count == 1 && String === args.first
end
received_arg_list(*args) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 295
def received_arg_list(*args)
  args.map(&:inspect).join(", ")
end
times(count) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 305
def times(count)
  "#{count} time#{count == 1 ? '' : 's'}"
end
unexpected_arguments_message(expected_args_string, actual_args_string) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 226
def unexpected_arguments_message(expected_args_string, actual_args_string)
  "with unexpected arguments\n  expected: #{expected_args_string}\n       got: #{actual_args_string}"
end
unpack_string_args(formatted_expected_args, actual_args) click to toggle source
# File lib/rspec/mocks/error_generator.rb, line 240
def unpack_string_args(formatted_expected_args, actual_args)
  if [formatted_expected_args, actual_args].all? { |x| list_of_exactly_one_string?(x) }
    [formatted_expected_args.first, actual_args.first]
  else
    [formatted_expected_args, actual_args]
  end
end