module Minitest::StubOnRoids

Public Instance Methods

stub_and_expect(method_name, retval = :retval_placeholder, expected_args = [], times: 1, expectations: []) { || ... } click to toggle source
# File lib/minitest/stub_on_roids.rb, line 38
def stub_and_expect(method_name, retval = :retval_placeholder, expected_args = [],
                    times: 1, expectations: [])
  raise_if_bad_args(retval, expected_args, expectations)
  raise_if_already_stubbed(method_name)
  mock = build_mock(retval, expected_args, times, expectations)

  stub(method_name, mock) do
    yield
  end

  mock.verify
rescue StandardError => e
  # Monkeypatching the error message for better readability
  raise e.class, e.message.gsub(":call", ":#{method_name}")
end
stub_with_args(method_name, retval, expected_args = []) { || ... } click to toggle source
# File lib/minitest/stub_on_roids.rb, line 20
def stub_with_args(method_name, retval, expected_args = [])
  raise_if_already_stubbed(method_name)

  retval_with_args_assertion = lambda do |*actual_args|
    expected_args.zip(actual_args).each do |expected_arg, actual_arg|
      next if expected_arg == actual_arg

      raise StubbedMethodArgsError.new(method_name, self, actual_args)
    end

    retval
  end

  stub(method_name, retval_with_args_assertion) do
    yield
  end
end

Private Instance Methods

build_mock(retval, expected_args, times, expectations) click to toggle source
# File lib/minitest/stub_on_roids.rb, line 56
def build_mock(retval, expected_args, times, expectations)
  mock = Minitest::Mock.new

  if expectations.size.zero?
    times.times { mock.expect :call, retval, expected_args }
  else
    expectations.each do |expectation|
      validate_expectation(expectation)
      expectation_times = expectation[:times] || 1

      expectation_times.times do
        mock.expect :call, expectation[:return_value], expectation[:expected_args]
      end
    end
  end

  mock
end
raise_if_already_stubbed(method_name) click to toggle source
# File lib/minitest/stub_on_roids.rb, line 75
def raise_if_already_stubbed(method_name)
  return unless respond_to? "__minitest_stub__#{method_name}"

  raise MethodAlreadyStubbedError, method_name
end
raise_if_bad_args(retval, expected_args, expectations) click to toggle source
# File lib/minitest/stub_on_roids.rb, line 81
def raise_if_bad_args(retval, expected_args, expectations)
  if (!:retval_placeholder.eql?(retval) || expected_args.size.positive?) &&
     expectations.size.positive?
    raise ArgumentError,
          "`retval` and `expected_args` arguments cannot be passed along with `expectations`"
  end
end
validate_expectation(expectation) click to toggle source
# File lib/minitest/stub_on_roids.rb, line 89
def validate_expectation(expectation)
  %i[expected_args return_value].each do |k|
    raise ArgumentError, "Missing key #{k} in expectation definition" unless expectation.key?(k)
  end
end