0

在我的 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 运行之前完成?

4

0 回答 0