使用Rspec示例进行Resque测试?

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

你尝试过不使用resque_spec和resque_unit运行它吗? - bonyiii
3个回答

8

我个人测试我的工作人员的方式与众不同。我使用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

那么你的模型/控制器测试速度更快,而且在测试中没有模型/控制器和工作程序之间的依赖关系。您还不必在规格中模拟与工作者无关的许多事情。

但是,如果您想像您提到的那样做,这在一段时间内对我有效。我将Resque.inline = true放入我的测试环境配置中。


谢谢您提供不同的方法,但我的担忧是,即使我在我的initializer/resque.rb文件中设置了Resque.inline = true,它仍然不能按预期工作。也就是说,puts语句没有被执行。 - Gagan
但是只有put不起作用吗?尝试执行类似于echo bla > /tmp/test的命令。 - Daniel Spangenberg
我认为这两种方法都是有效的。如果你想要端到端的规格说明,那么 Resque.inline = true 就可以了。如果你正在编写模型规格说明,则不必要。 - B Seven

0

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

Resque.logger = Rails.logger

或者您可以通过将以下内容添加到/lib/tasks/resque.rake来设置单独的日志文件。当您运行工作进程时,它将写入/log/resque.log

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,除非您的方法在类的“private”部分中。当编写rspec测试时,这让我有点困惑。ActionMailer也需要自己的日志设置。我想我一直期望更多的是约定而不是配置。 :)


0
在 spec_helper.rb 文件中,
你可以添加:
config.before :each do
    Resque.inline = true
end

我曾经遇到同样的问题,但通过上述方法解决了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接