我如何测试我的回调

时间:2014-03-28 12:02:16

标签: ruby-on-rails activerecord ruby-on-rails-4 rspec

我有三种模式 - 联系,互动和潜在客户。

当发生生成潜在客户(is_lead)的交互时,我正在更新潜在客户状态或创建新潜在客户(具体取决于是否存在)。针对联系人捕获了潜在客户。

为了实现这一点,我使用了一个调用process_interaction的回调after_commit。见下文

class Interaction < ActiveRecord::Base

  belongs_to :contact
  has_many :leads

  enum interaction_type: { file_download: 1, email: 2, telesale: 3, registration: 4 }

  after_commit :process_interaction, on: [:create, :update]

  private

  def process_interaction
    if file_download? || email? || telesale?
      lead = Lead.find_or_initialize_by(contact_id: contact_id)
      self.is_lead ? lead.active! : lead.stale!
    end
  end
end

代码非常直接且有效。我的问题是我该如何测试呢?我真的不知道如何正确测试回调。或者如何更改我的代码以使其更易于测试。我已经阅读了很多文章而且无法弄清楚如何做到这一点。另外,我不确定这个逻辑是否应该存在于我的交互模型中。我仍然试图掌握我的依赖关系的方向。

注意我确实尝试通过而不是

将相互作用注入到引导中
def process_interaction
    if file_download? || email? || telesale?
      Lead.process_potential_lead(interaction) 
    end
  end

这将实现相同的目标,但处理将在引导方面完成。不知道如何在我的交互规范中测试这个并且不确定哪种方式更好。

1 个答案:

答案 0 :(得分:0)

我不会直接测试回调,而是测试回调的效果,在这种情况下是创建一个Lead对象并将其置于适当的状态。

所以基本上类似于以下内容:

it 'should create an active lead' do

  ... create the appropriate interaction object ...

  lead = Lead.where(contact_id: contact_id).first
  expect(lead.active?).to be_true

end

就个人而言,我避免使用回调,并希望在您处理3种不同模型的情况下创建服务对象。您最有可能发现测试服务对象更简单。