调用 ActiveJob::TestHelper 方法会导致 SystemStackError: stack level too deep

Kat*_*tie 3 integration-testing ruby-on-rails rails-activejob

我正在使用 Rails 5.1.6 和 Ruby 2.5.1(尽管在以前的版本中出现了相同的错误)。

将邮件程序从 Deliver_now 切换到 Deliver_later。在我的浏览器中工作正常,但是我一直在尝试让我的集成测试正常工作。似乎使用ActiveJob::TestHelper 中的任何方法都会触发以下错误:

错误:SendJobToContactsTest#test_send_job_to_contacts:SystemStackError:堆栈级别太深

集成测试代码:

require 'test_helper'
include ActiveJob::TestHelper

class SendJobToContactsTest < ActionDispatch::IntegrationTest
...
end
Run Code Online (Sandbox Code Playgroud)

这工作正常:

assert_difference 'ContactJob.count', 1 do
    patch update_contacts_user_job_path(@user, @job), params: {job: {contact_ids: [ @contact2.id], message: {message_text: "This is a test"}}}
end
Run Code Online (Sandbox Code Playgroud)

使用performed_enqueued_jobs会触发 SystemStackError:

assert_difference 'ContactJob.count', 1 do
  perform_enqueued_jobs do
     patch update_contacts_user_job_path(@user, @job), params: {job: {contact_ids: [ @contact2.id], message: {message_text: "This is a test"}}}
  end
end
Run Code Online (Sandbox Code Playgroud)

即使只是assert_enqueued_jobs没有performed_enqueued_jobs触发 SystemStackError:

assert_difference 'ContactJob.count', 1 do
  patch update_contacts_user_job_path(@user, @job), params: {job: {contact_ids: [ @contact2.id], message: {message_text: "This is a test"}}}
  assert_enqueued_jobs 1
end
Run Code Online (Sandbox Code Playgroud)

事实证明,即使只是调用一个空的 Perform_enqueued_jobs 块(不涉及我的任何代码)也会触发堆栈级别太深的问题:

perform_enqueued_jobs do
 # do something later
end
Run Code Online (Sandbox Code Playgroud)

Kat*_*tie 6

事实证明问题出在我的 include 声明的位置。将其移动到类中解决了这个问题:

require 'test_helper'


class SendJobToContactsTest < ActionDispatch::IntegrationTest
  include ActiveJob::TestHelper
Run Code Online (Sandbox Code Playgroud)