Rspec как установить ожидание в суперклассе для переопределенного метода - PullRequest
3 голосов
/ 16 ноября 2011

У меня есть класс модели, который переопределяет update_attributes:

class Foo < ActiveRecord::Base
  def update_attributes(attributes)
    if super(attributes)
      #do some other cool stuff
    end
  end
end

Я пытаюсь выяснить, как установить ожидание и / или заглушку в супер версии update_attributes, чтобы убедиться, что в случае успеха все остальное сделано. Также я хочу убедиться, что супер метод на самом деле вызывается вообще.

Вот что я пробовал до сих пор (и это, конечно, не сработало):

describe "#update_attributes override" do
  it "calls the base class version" do
    parameters = Factory.attributes_for(:foo)
    foo = Factory(:foo, :title => "old title")
    ActiveRecord::Base.should_receive(:update_attributes).once
    foo.update_attributes(parameters)
  end
end

Конечно, это не работает:

Failure/Error: ActiveRecord::Base.should_recieve(:update_attributes).once
 NoMethodError:
   undefined method `should_recieve' for ActiveRecord::Base:Class

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

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
2 голосов
/ 27 сентября 2012

Попробуйте заменить should_recieve на should_receive.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...