diff options
Diffstat (limited to 'spec/support/helpers/next_found_instance_of.rb')
-rw-r--r-- | spec/support/helpers/next_found_instance_of.rb | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/spec/support/helpers/next_found_instance_of.rb b/spec/support/helpers/next_found_instance_of.rb index c8cdbaf2c5d..c7079e64ffd 100644 --- a/spec/support/helpers/next_found_instance_of.rb +++ b/spec/support/helpers/next_found_instance_of.rb @@ -2,19 +2,36 @@ module NextFoundInstanceOf ERROR_MESSAGE = 'NextFoundInstanceOf mock helpers can only be used with ActiveRecord targets' + HELPER_METHOD_PATTERN = /(?:allow|expect)_next_found_(?<number>\d+)_instances_of/.freeze - def expect_next_found_instance_of(klass) + def method_missing(method_name, ...) + return super unless match_data = method_name.match(HELPER_METHOD_PATTERN) + + helper_method = method_name.to_s.sub("_#{match_data[:number]}", '') + + public_send(helper_method, *args, match_data[:number].to_i, &block) + end + + def expect_next_found_instance_of(klass, &block) + expect_next_found_instances_of(klass, nil, &block) + end + + def expect_next_found_instances_of(klass, number) check_if_active_record!(klass) - stub_allocate(expect(klass), klass) do |expectation| + stub_allocate(expect(klass), klass, number) do |expectation| yield(expectation) end end - def allow_next_found_instance_of(klass) + def allow_next_found_instance_of(klass, &block) + allow_next_found_instances_of(klass, nil, &block) + end + + def allow_next_found_instances_of(klass, number) check_if_active_record!(klass) - stub_allocate(allow(klass), klass) do |allowance| + stub_allocate(allow(klass), klass, number) do |allowance| yield(allowance) end end @@ -25,8 +42,11 @@ module NextFoundInstanceOf raise ArgumentError, ERROR_MESSAGE unless klass < ActiveRecord::Base end - def stub_allocate(target, klass) - target.to receive(:allocate).and_wrap_original do |method| + def stub_allocate(target, klass, number) + stub = receive(:allocate) + stub.exactly(number).times if number + + target.to stub.and_wrap_original do |method| method.call.tap do |allocation| # ActiveRecord::Core.allocate returns a frozen object: # https://github.com/rails/rails/blob/291a3d2ef29a3842d1156ada7526f4ee60dd2b59/activerecord/lib/active_record/core.rb#L620 |