Rails RSpec / Cucumber测试失败,因为ActionMailer在DatabaseCleaner之后运行

时间:2016-04-28 18:01:54

标签: ruby-on-rails rspec cucumber database-cleaner

在我的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运行之前,如何确保应用程序全部完成?

0 个答案:

没有答案