File tree 4 files changed +36
-1
lines changed
lib/rspec/active_model/mocks
spec/rspec/active_model/mocks
4 files changed +36
-1
lines changed Original file line number Diff line number Diff line change 1
1
### Development
2
2
[ Full Changelog] ( https://github.com/rspec/rspec-activemodel-mocks/compare/v1.2.0...main )
3
3
4
+ Bug fixes:
5
+
6
+ * Fix ` === ` to work with multiple mocks. (@bquorning , #61 )
7
+
4
8
### 1.2.0 / 2023-12-10
5
9
[ Full Changelog] ( https://github.com/rspec/rspec-activemodel-mocks/compare/v1.1.0...v1.2.0 )
6
10
Original file line number Diff line number Diff line change @@ -135,11 +135,16 @@ def self.param_delimiter; "-"; end
135
135
:blank? => false } . merge ( stubs )
136
136
137
137
double ( "#{ model_class . name } _#{ stubs [ :id ] } " , stubs ) . tap do |m |
138
+ mock_store_klass = RSpec ::ActiveModel ::Mocks ::Mocks
138
139
if model_class . method ( :=== ) . owner == Module && !stubs . key? ( :=== )
140
+ allow ( mock_store_klass ) . to receive ( :mock_store ) do
141
+ @mock_store ||= Hash . new { |h , k | h [ k ] = [ ] }
142
+ end
139
143
allow ( model_class ) . to receive ( :=== ) . and_wrap_original do |original , other |
140
- m === other || original . call ( other )
144
+ mock_store_klass . mock_store [ model_class ] . any? { | ms | ms === other } || original . call ( other )
141
145
end
142
146
end
147
+ mock_store_klass . mock_store [ model_class ] << m if mock_store_klass . respond_to? ( :mock_store )
143
148
msingleton = class << m ; self ; end
144
149
msingleton . class_eval do
145
150
include ActiveModelInstanceMethods
Original file line number Diff line number Diff line change @@ -209,6 +209,19 @@ def self.===(_other)
209
209
end
210
210
# rubocop:enable Lint/LiteralAsCondition
211
211
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
212
225
end
213
226
214
227
describe "#kind_of?" do
Original file line number Diff line number Diff line change @@ -181,5 +181,18 @@ def model_class
181
181
end
182
182
# rubocop:enable Lint/LiteralAsCondition
183
183
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
184
197
end
185
198
end
You can’t perform that action at this time.
0 commit comments