update_attributes
- это метод экземпляра, а не метод класса, поэтому, насколько я знаю, вы не можете напрямую заглушить его на ActiveRecord::Base
с помощью rspec-mocks.И я не думаю, что вам следует: использование super
- это деталь реализации, с которой вы не должны связывать свой тест.Вместо этого лучше написать примеры, которые определяют поведение, которого вы хотите достичь.Какое поведение вы получаете от использования super
, которое вы бы не получили, если бы super
не использовалось?
Например, если это был код:
class Foo < ActiveRecord::Base
def update_attributes(attributes)
if super(attributes)
MyMailer.deliver_notification_email
end
end
end
... тогда я думаю, что интересным подходящим поведением является то, что электронное письмо доставляется только в том случае, если нет ошибок проверки (так как это приведет к тому, что super
вернет значение true, а не false).Итак, я могу описать это поведение так:
describe Foo do
describe "#update_attributes" do
it 'sends an email when it passes validations' do
record = Foo.new
record.stub(:valid? => true)
MyMailer.should_receive(:deliver_notification_email)
record.update_attributes(:some => 'attribute')
end
it 'does not sent an email when it fails validations' do
record = Foo.new
record.stub(:valid? => false)
MyMailer.should_receive(:deliver_notification_email)
record.update_attributes(:some => 'attribute')
end
end
end