Ruby on rails 如何测试我的回调

Ruby on rails 如何测试我的回调,ruby-on-rails,activerecord,ruby-on-rails-4,rspec,Ruby On Rails,Activerecord,Ruby On Rails 4,Rspec,我有三种模式——接触、互动和潜在客户 当发生产生潜在客户(is_lead)的交互时,我会更新潜在客户状态或创建新的潜在客户(取决于潜在客户是否存在)。根据联系人捕获线索 为了实现这一点,我在提交后使用回调,调用process\u交互。见下文 class Interaction < ActiveRecord::Base belongs_to :contact has_many :leads enum interaction_type: { file_download: 1,

我有三种模式——接触、互动和潜在客户

当发生产生潜在客户(is_lead)的交互时,我会更新潜在客户状态或创建新的潜在客户(取决于潜在客户是否存在)。根据联系人捕获线索

为了实现这一点,我在提交后使用回调,调用process\u交互。见下文

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

这将实现同样的效果,但处理将在前置端完成。不确定如何在我的交互规范中测试这个,也不确定哪种方法更好。

我不会直接测试回调,而是测试回调的效果,在本例中,回调是创建一个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种不同的模型,我会避免使用回调,并希望创建一个服务对象。您很可能会发现测试服务对象更简单。

据我所知,这是一种不好的做法。您应该通过剔除传入和传出消息来单独测试您的模型。编写上述测试非常简单,但它使您的测试依赖于两个不同的模型。因此,我将创建一个服务对象。您已经通过在交互类中使用Lead类耦合了模型。酷。。。所以我去读了很多东西,我明白你在说什么。即使只针对一个方法,创建一个服务对象是否值得?您是说我需要删除回调,并将回调调用移动到交互实例化的位置执行吗?(此调用将引用新的服务对象)。这是值得的,服务对象在代码库中具有更高的可见性,并封装了一段业务逻辑。正确-您应该消除回调,并在启动交互的位置使用SO(可能是控制器)。希望这能有所帮助。我现在明白了如何测试我的模型。我会为我的潜在客户模型和服务对象编写一个规范。我会写一个集成测试来同时测试这两个吗?e、 g.我有一个api记录交互并可能生成潜在客户。我是否会在更高的层次上测试这一点,以检查这两种情况是否都发生了——交互是创建的,潜在客户是生成的?
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