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