在rails 3.2上测试HABTM after_add / after_remove回调

时间:2014-07-08 08:50:04

标签: ruby-on-rails ruby-on-rails-3.2 mocking rspec2 shoulda

我有一个Person类HABTM Preferences - 当添加或删除首选项时,我需要调用一个通知第三方API的方法。

现在我的班级人员看起来像这样:

class Person < ActiveRecord::Base

    has_and_belongs_to_many :preferences, :after_add => :send_communication_preference_update

    def send_communication_preference_update(preference)
        ...
    end

end

为了测试这个,我有以下规范:

describe 'person.preferences #after_add' do
  let(:person)  { FactoryGirl.create(:person) }
  let(:pref)    { [Preference.find_by_preference_name("EmailMarketing")] }

  it 'should trigger callback' do
    person.preferences = pref
    person.should_receive(:send_communication_preference_update).with(pref.first)
  end
end

然而这不起作用。

即使丢失with(pref.first),也会产生同样的错误。

我得到的错误是:

Failure/Error: person.should_receive(:send_communication_preference_update).with(pref.first)
       (#<Person:0x000000086297a8>).send_communication_preference_update(#<Preference preference_id: 4, preference_name: "EmailMarketing", created_at: "2014-07-08 08:31:23", updated_at: "2014-07-08 08:31:23", active: true, default_value: false>)
           expected: 1 time
           received: 0 times

为什么会这样?

2 个答案:

答案 0 :(得分:2)

在调用要测试的方法之前,必须先设置should_receive。

答案 1 :(得分:2)

更改规范中的行顺序:您应在调用分配

之前放置should_receive
it 'should trigger callback' do
  person.should_receive(:send_communication_preference_update).with(pref.first)
  person.preferences = pref
end