【问题标题】:testing using Resque with Rspec examples?使用带有 Rspec 示例的 Resque 进行测试?
【发布时间】:2016-12-13 02:53:23
【问题描述】:

我正在使用 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 的情况下运行它吗?

标签: ruby-on-rails background jobs resque


【解决方案1】:

我个人对我的员工进行了不同的测试。我使用 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 放入我的测试环境配置中。

【讨论】:

  • 感谢您采用不同的方法,但我担心的是,即使我将 Resque.inline = true 放入我的初始化程序/resque.rb 文件中,它也无法按预期工作。即 puts 语句没有被执行。
  • 但是只有put不起作用吗?尝试执行类似echo bla > /tmp/test
  • 我认为这两种方法都有效。如果您想要端到端规范,那么Resque.inline = true 可以。如果您正在编写模型规范,则没有必要。
【解决方案2】:

关于日志记录的问题似乎从未得到解答。我遇到了类似的事情,这是因为没有设置 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 也需要它自己的日志设置。我想我一直期待比配置更多的约定。 :)

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2017-06-19
    • 2016-06-30
    相关资源
    最近更新 更多