【发布时间】:2017-06-28 03:31:42
【问题描述】:
我有一份正在排队的工作。有时,与该作业关联的记录会在作业运行之前被销毁。
为了解决在作业执行期间引发的任何ActiveJob::DeserializationError,我在作业中添加了以下内容:
rescue_from(ActiveJob::DeserializationError) do |exception|
exception.original_exception == ActiveRecord::RecordNotFound
end
我想对此进行测试,以便我可以验证当作业运行时记录已被销毁时不会引发ActiveJob::DeserializationError。
为了开始测试,我删除了上面的函数,并决定确保我可以测试ActiveJob::DeserializationError 确实被抛出了。规范是:
it "raises DeserializationError when a record is destroyed before perform" do
record = create(:record)
record.destroy
expect{ RecordDeletionJob.perform_later(record) }.to raise_error(ActiveJob::DeserializationError)
end
令我惊讶的是,规范失败了,因为没有提出任何内容。这是不正确的。如果没有rescue_from 方法,它应该会引发ActiveJob::DeserializationError。
我认为问题在于记录没有被重新加载,但我不知道如何在记录销毁后重新加载记录以及之后如何测试ActiveJob::DeserializationError。
在作业运行时记录不存在的情况下,如何测试ActiveJob::DeserializationError不抛出?
【问题讨论】:
-
如果将
perform_later替换为perform_now是否有效? -
它没有。这可能是我最初的问题中的一个错误,因为我实际上开始使用 perform_now 进行测试
标签: ruby-on-rails ruby rspec