我的 test.rb 中有這個代碼:
config.active_job.queue_adapter = :inline
在測驗中我有:
scenario '15 minutes after last call a recall should happen' do
p ActiveJob::Base.queue_adapter
end
這將回傳: ActiveJob::QueueAdapters::InlineAdapter
這很好,因為 perform_later 會立即執行。
但是,當我將type::request添加到測驗時,如下所示:
scenario '15 minutes after last call a recall should happen', type: :request do
p ActiveJob::Base.queue_adapter
end
我得到:requestActiveJob::QueueAdapters::TestAdapter并且 perform_later 不再執行。這是預期的行為嗎?如何確保在測驗中始終執行 perform_later 塊?
uj5u.com熱心網友回復:
作業不會排隊執行,但會排隊檢查它們是否已入隊(基本上只是保存在一個陣列中,以便您可以測驗它們是否在那里):
https://edgeapi.rubyonrails.org/classes/ActiveJob/QueueAdapters/TestAdapter.html
既然您用 rspec 標記了這個問題,那么就有適合您的完美匹配器:have_been_enqueued可以像這樣使用:
RSpec.describe UploadBackupsJob do
it "matches with enqueued job" do
ActiveJob::Base.queue_adapter = :test
UploadBackupsJob.perform_later
expect(UploadBackupsJob).to have_been_enqueued
end
end
uj5u.com熱心網友回復:
這與此問題有關:https : //github.com/rails/rails/issues/37270
推桿
(ActiveJob::Base.descendants << ActiveJob::Base).each(&:disable_test_adapter)
在實際測驗中修復它。
另一個更簡潔的選擇是(如果可能)將測驗型別更改為:type::system并確保您的 rspec-rails 版本 >= 4.1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/351977.html
