diff options
Diffstat (limited to 'spec/support/helpers/next_found_instance_of.rb')
-rw-r--r-- | spec/support/helpers/next_found_instance_of.rb | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/spec/support/helpers/next_found_instance_of.rb b/spec/support/helpers/next_found_instance_of.rb index ff34fcdd1d3..feb63f90211 100644 --- a/spec/support/helpers/next_found_instance_of.rb +++ b/spec/support/helpers/next_found_instance_of.rb @@ -6,7 +6,7 @@ module NextFoundInstanceOf def expect_next_found_instance_of(klass) check_if_active_record!(klass) - stub_allocate(expect(klass)) do |expectation| + stub_allocate(expect(klass), klass) do |expectation| yield(expectation) end end @@ -14,7 +14,7 @@ module NextFoundInstanceOf def allow_next_found_instance_of(klass) check_if_active_record!(klass) - stub_allocate(allow(klass)) do |allowance| + stub_allocate(allow(klass), klass) do |allowance| yield(allowance) end end @@ -25,9 +25,17 @@ module NextFoundInstanceOf raise ArgumentError.new(ERROR_MESSAGE) unless klass < ActiveRecord::Base end - def stub_allocate(target) + def stub_allocate(target, klass) target.to receive(:allocate).and_wrap_original do |method| - method.call.tap { |allocation| yield(allocation) } + 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 + # It's unexpected behavior and probably a bug in Rails + # Let's work it around by setting the attributes to default to unfreeze the object for now + allocation.instance_variable_set(:@attributes, klass._default_attributes) + + yield(allocation) + end end end end |