ruby-on-rails 测试使用Resque与Rspec的例子?

ix0qys7i  于 2023-04-22  发布在  Ruby
关注(0)|答案(3)|浏览(128)

我正在使用Resque处理我的后台作业。

class SomeClass
  ...
  repo = Repo.find(params[:repo_id])
  Resque.enqueue(ReopCleaner, repo.id)
  ...
end

class RepoCleaner
  @queue = :repo_cleaner

  def self.perform(repo_id)
    puts "this must get printed in console"
    repo = Repo.find(repo_id)    
    # some more action here
  end
end

现在,为了同步测试,我添加了

Resque.inline = Rails.env.test?

在config/initializers/resque.rb文件中
这应该是内联调用#perform方法,而不是将其排队到Redis中,并且没有任何Resque回调,因为Rails.env.test?在测试环境中返回true。
但是

"this must get printed in console"

在测试时从不打印。我的测试也失败了。
是否有我错过的配置。目前我正在使用

resque (1.17.1)
resque_spec (0.7.0)
resque_unit (0.4.0)
khbbv19g

khbbv19g1#

我个人测试我的工作者不同。我使用RSpec,例如在我的用户模型中,我测试了这样的东西:

it "enqueue FooWorker#create_user" do
  mock(Resque).enqueue(FooWorker, :create_user, user.id)
  user.create_on_foo
end

然后我有一个名为spec/workers/foo_worker_spec.rb的文件,内容如下:

require 'spec_helper'

describe FooWorker do

  describe "#perform" do
    it "redirects to passed action" do
      ...
      FooWorker.perform
      ...
    end
  end

end

这样你的模型/控制器测试运行得更快,并且你在测试中没有模型/控制器和worker之间的依赖关系。你也不必在规范中模拟那么多与worker无关的东西。
但是如果你不想像你提到的那样去做,它在我之前的时候是有效的,我把Resque.inline = true放到了我的测试环境配置中。

aelbi1ox

aelbi1ox2#

看起来关于日志记录的问题从来没有得到过回答。我遇到了类似的事情,这是因为没有设置Resque记录器。你可以做一些简单的事情:

Resque.logger = Rails.logger

或者你可以通过将其添加到/lib/tasks/resque. rake来设置一个单独的日志文件。

Resque.before_fork = Proc.new {
ActiveRecord::Base.establish_connection

# Open the new separate log file
logfile = File.open(File.join(Rails.root, 'log', 'resque.log'), 'a')

# Activate file synchronization
logfile.sync = true

# Create a new buffered logger
Resque.logger = ActiveSupport::Logger.new(logfile)
Resque.logger.level = Logger::INFO
Resque.logger.info "Resque Logger Initialized!"
}

像上面提到的daniel-spangenberg这样的嘲笑应该写STDOUT,除非你的方法在你的类的“私有”部分。这在写rspec测试时让我绊倒了几次。ActionMailer也需要它自己的日志设置。我想我一直期待更多的约定而不是配置。:)

6g8kf2rb

6g8kf2rb3#

在spec_helper.rb
您可以添加

config.before :each do
    Resque.inline = true
end

我也遇到了同样的问题,上面的解决了。

相关问题