我正在使用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 回答
原来问题是我有include语句的地方 . 在课堂上移动它解决了这个问题: