After_udpate rails回调失败测试

问题描述 投票:1回答:1

我有一个:after_update挂钩,可以在订单状态发生变化时发送电子邮件。似乎未通过以下测试,因为:order_status_id_chaned?返回false。

测试:

context 'when the order_status changes' do
  it 'should send an email' do
    @order2.save
    expect(subject).to receive(:send_confirmation_email)
    @order2.update(order_status_id: 2)
  end
end

Order.rb

class Order < ApplicationRecord
  after_update :send_confirmation_email, if: :order_just_submitted? 

  def order_just_submitted?
    p self.order_status_id_changed? # prints false
    p self.is_submitted? # prints true
    self.order_status_id_changed? and self.is_submitted?
  end

  def send_confirmation_email
    ...
  end
end

知道为什么:order_status_id_chaned?在更新值后会返回false吗?

ruby-on-rails callback
1个回答
1
投票

order_status_id_changed?在被调用时是错误的,因为它只在更新后调用。保存记录后,更改将移至previous_changes,因此您可以执行以下操作:

def order_just_submitted?
  previous_changes.keys.include?('order_status_id') && is_submitted?
end

此外,除非您想要在任何状态更改时触发电子邮件,否则您可能需要检查状态更改的内容。

© www.soinside.com 2019 - 2024. All rights reserved.