Skip to content

Commit 4142ad1

Browse files
authored
Merge pull request #61 from bquorning/fix-===-for-multiple-stubs
Fix === for multiple mocks of the same model
2 parents b6d57c8 + b299f07 commit 4142ad1

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
### Development
22
[Full Changelog](https://github.com/rspec/rspec-activemodel-mocks/compare/v1.2.0...main)
33

4+
Bug fixes:
5+
6+
* Fix `===` to work with multiple mocks. (@bquorning, #61)
7+
48
### 1.2.0 / 2023-12-10
59
[Full Changelog](https://github.com/rspec/rspec-activemodel-mocks/compare/v1.1.0...v1.2.0)
610

lib/rspec/active_model/mocks/mocks.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ def association(association_name)
9494
# * A String representing a Class that extends ActiveModel::Naming
9595
# * A Class that extends ActiveModel::Naming
9696
def mock_model(string_or_model_class, stubs={})
97+
@__rspec_active_model_mocks ||= Hash.new { |h, k| h[k] = [] }
98+
9799
if String === string_or_model_class
98100
if Object.const_defined?(string_or_model_class)
99101
model_class = Object.const_get(string_or_model_class)
@@ -137,9 +139,10 @@ def self.param_delimiter; "-"; end
137139
double("#{model_class.name}_#{stubs[:id]}", stubs).tap do |m|
138140
if model_class.method(:===).owner == Module && !stubs.key?(:===)
139141
allow(model_class).to receive(:===).and_wrap_original do |original, other|
140-
m === other || original.call(other)
142+
@__rspec_active_model_mocks[model_class].include?(other) || original.call(other)
141143
end
142144
end
145+
@__rspec_active_model_mocks[model_class] << m
143146
msingleton = class << m; self; end
144147
msingleton.class_eval do
145148
include ActiveModelInstanceMethods

spec/rspec/active_model/mocks/mock_model_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,19 @@ def self.===(_other)
209209
end
210210
# rubocop:enable Lint/LiteralAsCondition
211211
end
212+
213+
it "works for multiple mocks of the same model" do
214+
foo = mock_model(MockableModel)
215+
bar = mock_model(MockableModel)
216+
baz = mock_model(MockableModelNoPrimaryKey)
217+
quz = mock_model(MockableModel)
218+
219+
expect(MockableModel === foo).to be(true)
220+
expect(MockableModel === bar).to be(true)
221+
expect(MockableModel === baz).to be(false)
222+
expect(MockableModelNoPrimaryKey === baz).to be(true)
223+
expect(MockableModel === quz).to be(true)
224+
end
212225
end
213226

214227
describe "#kind_of?" do

spec/rspec/active_model/mocks/stub_model_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,5 +181,18 @@ def model_class
181181
end
182182
# rubocop:enable Lint/LiteralAsCondition
183183
end
184+
185+
it "works for multiple mocks of the same model" do
186+
foo = stub_model(MockableModel)
187+
bar = stub_model(MockableModel)
188+
baz = stub_model(MockableModelNoPrimaryKey)
189+
qux = stub_model(MockableModel)
190+
191+
expect(MockableModel === foo).to be(true)
192+
expect(MockableModel === bar).to be(true)
193+
expect(MockableModel === baz).to be(false)
194+
expect(MockableModelNoPrimaryKey === baz).to be(true)
195+
expect(MockableModel === qux).to be(true)
196+
end
184197
end
185198
end

0 commit comments

Comments
 (0)