2016-09-13 5 views
0

У меня есть класс модели Rails с функцией, которая будет выполнена позднее, управление которой осуществляется с помощью Delayed::Job. Вот функция (упрощенно):Как отложить задержку функции в среде Rails-тестов

def fn_with_dj_delay 
    puts "puts output here" 
    do_somethting_else 
end 
handle_asynchronously :fn_with_dj_delay, :run_at => Proc.new { 24.hours.from_now }, :queue => 'my_queue' 

Когда функция вызывается в моей тестовой среде Rails однако, затягивание в настоящее время пропускается. Возможно ли, чтобы это было выполнено в обеих средах?

В rails c test функция срабатывает немедленно. Вот немного упрощен и усеченный журнал консоли:

2.3.1 :004 > x = MyClass.new 
2.3.1 :005 > x.save! 
2.3.1 :006 > x.fn_with_dj_delay 
puts output here 
=> #<Delayed::Backend::ActiveRecord::Job id: nil, priority: 0, attempts: 0 # ... 
2.3.1 :007 > Delayed::Job.last 
    Delayed::Backend::ActiveRecord::Job Load (0.3ms) SELECT `delayed_jobs`.* # ... 
=> nil 

В rails c функция автоматически задерживается в соответствии с инструкциями. Опять же, немного упрощенный и усеченный лог консоли:

2.3.1 :004 > x = MyClass.new 
2.3.1 :005 > x.save! 
2.3.1 :006 > x.fn_with_dj_delay 
    (0.2ms) BEGIN 
    SQL (0.4ms) INSERT INTO `delayed_jobs` (`handler`, `run_at`, # ... 
    (0.5ms) COMMIT 
=> true 
2.3.1 :007 > Delayed::Job.last 
    Delayed::Backend::ActiveRecord::Job Load (2.2ms) SELECT `delayed_jobs`.* # ... 
=> #<Delayed::Backend::ActiveRecord::Job id: 1, priority: 0, attempts: 0 # ... 

Единственный ключом я могу видеть, это возвращается, uninstantiated Delayed::Backend::ActiveRecord::Job объекта в тестовой консоли, когда функция заканчивается. Если в объекте есть что-то недействительное, я мог бы понять этот сбой, хотя я бы ожидал, что возникнет ошибка. Независимо от того, что это не вопрос:

2.3.1 :004 > res = p.check_for_similar_web_data 
puts output here 
=> #<Delayed::Backend::ActiveRecord::Job id: nil, priority: 0, attempts: 0 # ... 
2.3.1 :005 > res.valid? 
=> true 
2.3.1 :006 > res.save! 
    (0.1ms) BEGIN 
    SQL (0.4ms) INSERT INTO `delayed_jobs` (`handler`, `run_at` # ... 
    (0.5ms) COMMIT 
=> true 

ответ

0

Это так просто, я удивлен и смущен, я не нашел его, прежде чем писать это. Я думаю, что по умолчанию false в тестовой среде?

2.3.1 :003 > Delayed::Worker.delay_jobs = true 
2.3.1 :004 > x = MyClass.new 
2.3.1 :005 > x.save! 
2.3.1 :006 > x.fn_with_dj_delay 
    (0.2ms) BEGIN 
    SQL (0.4ms) INSERT INTO `delayed_jobs` (`handler`, `run_at`, # ... 
    (0.5ms) COMMIT 
=> true 
2.3.1 :007 > Delayed::Job.last 
    Delayed::Backend::ActiveRecord::Job Load (2.2ms) SELECT `delayed_jobs`.* # ... 
=> #<Delayed::Backend::ActiveRecord::Job id: 1, priority: 0, attempts: 0 # .. 

As seen (in reverse) here.