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