Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用Resque和Rspec示例进行测试?_Ruby On Rails_Background_Jobs_Resque - Fatal编程技术网

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

Ruby on rails 使用Resque和Rspec示例进行测试?,ruby-on-rails,background,jobs,resque,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 co

我正在使用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 method inline,而不将其排队到Redis中,也不需要任何像Rails.env.test这样的Resque回调?在测试环境中返回true

但是

测试时从不打印。我的测试也不及格

是否有我遗漏的配置。 目前我正在使用

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

我亲自测试我的员工。我使用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记录器。您可以做一些简单的事情,如:

Resque.logger = Rails.logger
或者,您可以通过将该日志文件添加到/lib/tasks/resque.rake来设置单独的日志文件。运行worker时,它将写入/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也需要自己的日志设置。我想我期待的是更多的惯例而不是配置。:)

感谢您提供了一种不同的方法,但我担心的是,即使我在initializer/Resque.rb文件中设置了Resque.inline=true,它也无法正常工作。puts语句未执行。但是否只有put不起作用?尝试执行类似于
echobla>/tmp/test
的操作,我认为这两种方法都是有效的。如果需要端到端规格,则
Resque.inline=true
有效。如果您正在编写模型规格,则不必这样做。您是否尝试在没有resque_规格和resque_单元的情况下运行它?
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!"
}