【问题标题】:How do I test my callback如何测试我的回调
【发布时间】:2014-03-28 12:02:15
【问题描述】:

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

当发生产生潜在客户 (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

这将实现相同的效果,但处理将在引导端完成。不确定如何在我的交互规范中对此进行测试,也不确定哪种方式更好。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 据我了解,这是不好的做法。您应该通过存根传入和传出消息来单独测试您的模型。编写上述测试非常简单,但它会使您的测试依赖于两个不同的模型。
    • 因此我要创建一个服务对象。您已经使用 Interaction 类中的 Lead 类耦合了模型。
    • 酷......所以我已经去阅读了一堆东西blog.codeclimate.com/blog/2012/10/17/…railscasts.com/episodes/398-service-objects我明白你在说什么。即使仅针对单个方法,是否值得创建服务对象?你也是说我需要删除我的回调并移动回调调用以在交互被实例化的地方执行? (此调用将引用新的服务对象)。
    • 可以是值得的,服务对象在代码库中有更多的可见性,并且封装了一段业务逻辑。正确 - 您将消除回调并使用启动交互的 SO(可能是控制器)。希望对您有所帮助。
    • 我知道我现在将如何测试我的模型。我会为我的主要模型编写一个规范,并为我的服务对象编写一个规范。我会写一个集成测试来测试这两者吗?例如我有一个记录交互并可能产生潜在客户的 api。我是否会在更高的级别上对此进行测试以检查这两种情况是否发生 - 创建交互并生成潜在客户?
    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多