在我的Rails应用程序中,我有几个控制器,我有一个after_action挂钩,通过ActionMailer发送电子邮件。像这样:
after_action :send_notifications, only: [:create, :update]
def send_notifications
case @record.status.downcase
when 'review', 'corrected'
RecordNotifier.received(@record).deliver_later
when 'rejected'
@rejection = Rejection.where(record_id: @record.id).last
RecordNotifier.rejected(@record, @rejection).deliver_later
when 'submitted'
@form = Form.find( @record.form_id )
RecordNotifier.submitted(@record).deliver_later
end
end
我的问题是我的测试套件随机失败,因为有时邮件程序仍然需要在规范运行后完成执行,但由于数据库在每次测试后都得到清理,因此邮件程序所需的对象不再存在。但我很确定这个问题 - 我有一个测试以这种方式失败,但是当我在最后一个sleep 1
语句之前添加expect(page).to have_something
时,它就通过了。我也可以在日志中看到它 - 数据库在应用程序准备好之前就已经被破坏了。
顺便说一句,我没有为邮件程序设置任何ActiveJob,我只使用了deliver_later,因为指南说它的工作方式相同,如果我稍后添加ActiveJob,它就已经准备好了。
那么我该如何避免这种情况呢?在规范退出和DatabaseCleaner运行之前,如何确保应用程序全部完成?