Cha*_*ems 2 rspec ruby-on-rails delayed-job rails-activejob
我正在为学生构建电子邮件提醒功能。他们应该按照讲师指定的时间间隔收到一封电子邮件,表明他们取得了多少进步。
我的方法是使用 ActiveJob 来安排发送电子邮件的作业,然后当执行该作业时,我使用回调after_perform来安排下一个作业(摘自这篇文章)。看起来是这样的:
class StudentReminderJob < ApplicationJob
queue_as :default
after_perform do |job|
# (get user update frequency preference)
self.class.set(wait: update_frequency).perform_later(job.arguments[0])
end
def perform(user)
# Send email containing student stats information
UserMailer.send_student_reminder_email(user)
end
end
Run Code Online (Sandbox Code Playgroud)
最初的一组提醒将由 rake 任务启动。
我的问题是这样的:当尝试测试上面的代码时,perform_enqueued_jobs我似乎遇到了无限循环。这是我的测试:
require 'rails_helper'
describe StudentReminderJob, active_job: true, type: :job do
include ActiveJob::TestHelper
include ActiveSupport::Testing::TimeHelpers
let(:user) { create :user }
subject(:job) { described_class.perform_later(user) }
it 'gets enqueued' do
# Passes
expect { job }.to have_enqueued_job(described_class)
end
it 'receives perform later with user and base URL' do
# Passes (may be duplicatative)
expect(StudentReminderJob).to receive(:perform_later).with(user)
job
end
it 'calls UserMailer with #send_student_reminder_email when performed' do
# Fails - (SystemStackError: stack level too deep)
expect(UserMailer).to receive(:send_student_reminder_email)
perform_enqueued_jobs { job }
end
after do
clear_enqueued_jobs
clear_performed_jobs
end
end
Run Code Online (Sandbox Code Playgroud)
它阻止的第三个失败并显示SystemStackError: stack level too deep。有没有一种方法可以只执行队列中的一项作业,而避免执行回调中的作业?
理想情况下,我希望扩大测试覆盖范围,以确保新作业在给定的日期和时间排队。
小智 5
我怀疑这里的问题是perform_enqueued_jobs助手尝试执行队列中的所有作业,直到该点,但队列列表永远不会耗尽,因为每个作业都会对另一个作业进行排队(因此出现循环)。
尝试这个,
perform_later。currently_queued_job = enqueued_jobs.first作业详细信息。perform_enqueued_jobs但使用该:only选项来过滤/限制将执行的作业。例如,perform_enqueued_jobs(
only: ->(job) { job['job_id'] == currently_queued_job['job_id'] }
)
Run Code Online (Sandbox Code Playgroud)
这是 Rails文档,提到perform_enqueued_jobs:
:only选项:except接受类、类数组或过程。当传递 Proc 时,作业的实例将作为参数传递。
| 归档时间: |
|
| 查看次数: |
1767 次 |
| 最近记录: |