【发布时间】:2021-10-30 16:27:01
【问题描述】:
使用 Rails
4.1.6,Ruby2.3.1。
我按照本指南前往use ActiveJob in Rails 4.1
# app/jobs/my_notification_job.rb
class MyNotificationJob < ActiveJob::Base
queue_as :default
def perform(args)
...
end
end
# my_model.rb
def send_notification
...
MyNotificationJob.enqueue({key1: val1, key2: val2})
...
end
# my_models_controller.rb
def publish
...
my_model_instance.send_notification
...
end
但它在测试环境中引发了以下加载错误
LoadError:
cannot load such file -- active_job/arguments
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `block in require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:232:in `load_dependency'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `block in require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:232:in `load_dependency'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `block in require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:232:in `load_dependency'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `block in require'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:232:in `load_dependency'
# /gems/gems/activesupport-4.1.6/lib/active_support/dependencies.rb:247:in `require'
# ./spec/rails_helper.rb:10:in `<top (required)>'
所以我跳过了在测试环境中加载 ActiveJob
# config/initializers/active_job.rb
unless Rails.env.test?
require 'active_job'
ActiveJob::Base.queue_adapter = :delayed_job
end
基于dhruv mehta's 对this post 的建议,我在测试组中添加了gem activejob_backport
# Gemfile
group :test do
gem 'activejob_backport'
gem 'rspec-rails', '~> 3.9'
gem 'simplecov'
gem 'factory_bot_rails', '~> 4.11.1'
gem 'faker', '~> 2.2.1'
gem 'shoulda-matchers'
gem 'shoulda-callback-matchers'
gem 'byebug'
end
RSpec 代码
# spec/rails_helper.rb
RSpec.configure do |config|
config.include ActiveJob::TestHelper
end
# spec/my_models_controller_spec.rb
require 'rails_helper'
RSpec.describe MyModelsController, type: :controller do
it 'enqueues the job' do
ActiveJob::Base.queue_adapter = :delayed_job
get :publish
end
end
然后我收到以下错误
NoMethodError: undefined method `enqueue' for MyNotificationJob:Class
查看documentation 后,我意识到必须在实例上调用enqueue。但正如您在上面看到的,我在 MyNotificationJob 类上调用它,它在生产中运行良好。
如果有人能帮我解决这个问题,我将不胜感激
【问题讨论】:
-
MyNotificationJob是什么,请补充相关信息? -
它继承自
ActiveJob::Base,并将发送电子邮件通知
标签: ruby-on-rails ruby rspec delayed-job rails-activejob