首页 文章

调用ActiveJob :: TestHelper方法会导致SystemStackError:堆栈级别太深

提问于
浏览
0

我正在使用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

这很好用:

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

使用 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

即使只是 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

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

perform_enqueued_jobs do
 # do something later
end

1 回答

  • 1

    原来问题是我有include语句的地方 . 在课堂上移动它解决了这个问题:

    require 'test_helper'
    
    
    class SendJobToContactsTest < ActionDispatch::IntegrationTest
      include ActiveJob::TestHelper
    

相关问题