【问题标题】:NoMethodError: undefined method `enqueue' | RSpec | ActiveJob | Rails 4.1NoMethodError:未定义的方法“入队”|规范 |活跃工作 |导轨 4.1
【发布时间】:2021-10-30 16:27:01
【问题描述】:

使用 Rails 4.1.6,Ruby 2.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


【解决方案1】:

抛开类方法/实例方法的问题,我会倾向于模拟MyNotificationJob这样的东西。

before do
  allow(MyNotificationJob).to receive(:enqueue).and_return(true) # or whatever value is appropriate
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2013-04-24
    相关资源
    最近更新 更多