Skip to content

Commit 19d09b8

Browse files
authored
Merge pull request #55 from rspec/fix-case-equality-by-mocking-===
Mock === on the modal_class when defining a mock
2 parents 44e08e9 + e687183 commit 19d09b8

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

lib/rspec/active_model/mocks/mocks.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ def self.primary_key; :id; end
124124
:blank? => false}.merge(stubs)
125125

126126
double("#{model_class.name}_#{stubs[:id]}", stubs).tap do |m|
127+
if model_class.method(:===).owner == Module && !stubs.has_key?(:===)
128+
allow(model_class).to receive(:===).and_wrap_original do |original, other|
129+
m === other || original.call(other)
130+
end
131+
end
127132
msingleton = class << m; self; end
128133
msingleton.class_eval do
129134
include ActiveModelInstanceMethods

spec/rspec/active_model/mocks/mock_model_spec.rb

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,50 @@
157157
end
158158
end
159159

160+
describe "#===" do
161+
it "works with a case statement" do
162+
case mock_model(MockableModel)
163+
when MockableModel then true
164+
else
165+
raise
166+
end
167+
168+
case :not_mockable_model
169+
when MockableModel then raise
170+
else
171+
true
172+
end
173+
end
174+
175+
it "won't break previous stubs" do
176+
allow(MockableModel).to receive(:===).with("string") { true }
177+
mock_model(MockableModel)
178+
179+
case "string"
180+
when MockableModel then true
181+
else
182+
raise
183+
end
184+
end
185+
186+
it "won't override class definitions" do
187+
another_mockable_model =
188+
Class.new(MockableModel) do
189+
def self.===(other)
190+
true
191+
end
192+
end
193+
194+
mock_model(another_mockable_model)
195+
196+
case "string"
197+
when another_mockable_model then true
198+
else
199+
raise
200+
end
201+
end
202+
end
203+
160204
describe "#kind_of?" do
161205
before(:each) do
162206
@model = mock_model(SubMockableModel)

spec/rspec/active_model/mocks/stub_model_spec.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,21 @@ def model_class
161161
end
162162
expect(model).to be(@block_arg)
163163
end
164+
end
165+
166+
describe "#===" do
167+
it "works with a case statement" do
168+
case stub_model(MockableModel)
169+
when MockableModel then true
170+
else
171+
raise
172+
end
164173

174+
case :not_stub_model
175+
when MockableModel then raise
176+
else
177+
true
178+
end
179+
end
165180
end
166181
end

0 commit comments

Comments
 (0)