gpt4 book ai didi

ruby-on-rails - 如何测试 ActiveJob 回调?

转载 作者:行者123 更新时间:2023-12-02 20:30:33 24 4
gpt4 key购买 nike

我正在为学生构建电子邮件提醒功能。他们应该按照讲师指定的时间间隔收到一封电子邮件,表明他们取得了多少进步。

我的方法是使用 ActiveJob 来安排发送电子邮件的作业,然后在执行该作业时,我使用 after_perform 回调来安排下一个作业(取自 this post )。看起来像这样:

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

第一组提醒将由 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

第三个它阻止失败,并显示SystemStackError:堆栈级别太深。有没有一种方法可以只执行队列中的一项作业,而避免执行回调中的作业?

理想情况下,我希望扩大测试覆盖范围,以确保新作业在给定的日期和时间排队。

最佳答案

我怀疑这里的问题是 perform_enqueued_jobs 帮助程序尝试执行队列中的所有作业,直到该点,但队列列表永远不会耗尽,因为每个作业都会对另一个作业进行排队(因此循环)。

试试这个,

  1. 首先,使用 perform_later 将作业放入队列中。
  2. 从队列 currently_queued_job = enqueued_jobs.first 中获取作业详细信息。
  3. 调用perform_enqueued_jobs,但使用:only选项来过滤/限制将要执行的作业。例如,
perform_enqueued_jobs(
only: ->(job) { job['job_id'] == currently_queued_job['job_id'] }
)

这是 Rails documentation对于perform_enqueued_jobs,提及:

:only and :except options accepts Class, Array of Class or Proc. When passed a Proc, an instance of the job will be passed as argument.

关于ruby-on-rails - 如何测试 ActiveJob 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48879876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com