【问题标题】:Testing HABTM after_add/after_remove callbacks on rails 3.2在 Rails 3.2 上测试 HABTM after_add/after_remove 回调
【发布时间】:2014-07-08 08:50:04
【问题描述】:

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

现在我的 person 类看起来像这样:

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

这是为什么?

【问题讨论】:

  • 更改规范中的行顺序:您应该在调用分配之前放置should_receive
  • 请添加您的评论作为答案,我将奖励您正确的答案。

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


【解决方案1】:

更改您的规范中的行顺序:您应该在调用分配之前放置should_receive

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多