使用 RSpec 测试 DeserializationError

cmw*_*all 5 ruby rspec ruby-on-rails

我有一份正在排队的工作。有时,与该作业关联的记录会在作业运行之前被销毁。

为了解决ActiveJob::DeserializationError作业执行期间引发的任何问题,我在作业中添加了以下内容:

rescue_from(ActiveJob::DeserializationError) do |exception|
  exception.original_exception == ActiveRecord::RecordNotFound
end
Run Code Online (Sandbox Code Playgroud)

我想对此进行测试,以便我可以验证没有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
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,该规范失败了,因为没有提出任何问题。这是不正确的。如果没有该rescue_from方法,它应该引发一个ActiveJob::DeserializationError.

我认为问题是记录没有被重新加载,但我不知道如何在记录销毁后重新加载记录以及如何测试之后的情况ActiveJob::DeserializationError

如何测试ActiveJob::DeserializationError作业运行时记录不存在的情况下不抛出?

bee*_*gic 0

我是这样测试的:

it "retries 5 times" do
  serialized_args = [
        {
          "_aj_ruby2_keywords" => [
            "entity",
          ],
          "entity" => {
            "_aj_globalid"=> "gid://app/Entity/6ec11df7-ccf3-45ee-bc1c-f61821ef0aa2"
          }
        }
      ]
  subject.serialized_arguments = serialized_args
  4.times { subject.perform_now }
  expect { subject.perform_now }.to raise_exception(ActiveJob::DeserializationError)
end

Run Code Online (Sandbox Code Playgroud)