使用Resque和Rspec示例进行测试?

时间:2011-08-27 02:19:51

标签: ruby-on-rails background jobs resque

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

2 个答案:

答案 0 :(得分: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放入我的测试环境配置中。

答案 1 :(得分: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,除非你的方法属于你班级的“私人”部分。在编写rspec测试时,这让我绊倒了几次。 ActionMailer也需要它自己的日志设置。我想我一直期待比配置更多的约定。 :)