тестирование с использованием Resque с примерами Rspec? - PullRequest
7 голосов
/ 27 августа 2011

Я обрабатываю фоновые задания, используя 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 inline без помещения его в 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 ]

8 голосов
/ 27 августа 2011

Я лично проверяю своих работников по-разному. Я использую RSpec и, например, в своей пользовательской модели я тестирую что-то вроде этого:

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

Тогда у меня есть файл spec / worker / 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 в мою конфигурацию тестовой среды.

0 голосов
/ 12 декабря 2016

Похоже, что вопрос о регистрации не получил ответа. Я столкнулся с чем-то похожим на это, и это было от не настройки регистратора 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!"
}

Насмешливый, как упоминалось выше, Даниэля-Спангенберга, должен писать в STDOUT, если ваши методы не находятся в разделе "private" вашего класса. Это сбило меня с толку пару раз, когда я писал тесты rspec. Для ActionMailer также требуется собственная настройка журнала. Я предполагаю, что ожидал большего соглашения, чем конфигурации. :)

...