2009-09-09 58 views
2

我想測試delayed_job插件中的優先級如何工作。我使用從railscasts的郵件應用程序。我想我想發送100個高優先級的消息和100個低優先級的消息。我希望看到優先級較低的消息是否會按時交付,否則將被放在一邊。rails中的delayed_job插件的測試優先級

我該如何做這樣的測試。

回答

0

如果您有興趣瞭解這些郵件能夠以多快的速度到達真正的收件人,您可以只做一件事:發送這些郵件。由於灰名單,故障MX,擁塞的MX,破碎的內容掃描程序(或更糟糕的是,在SMTP代理模式下損壞的內容掃描程序),實際上沒有辦法確定這些郵件中有多少會延遲,接收服務器上的互聯網連接斷開等等。

1

創建這樣的測試應該不是一個大問題。生成100個高優先級的郵件,然後100個低。或相反亦然。在檢查數據庫以查看每項工作都在那裏並進行覈算之前,不要啓動您的工作人員。啓動你的員工並觀察工作是如何執行的 - 並按照正確的順序進行。請記住,d_j中的優先級是遞增的,因此優先級1高於10.

現在,200個職位並不是很多。你的工作人員很可能會很快地執行它們。如果你真的想測試你的低優先級郵件是否仍然發送,你可能不得不依賴於你的隊列中有什麼 - 只要你使用d_j不僅僅是電子郵件。我建議在隊列中填充至少幾千個工作 - 或者任何你可以設想的「最糟糕的情況」 - 然後運行測試。如果非電子郵件作業的優先級高於低優先級的電子郵件,則它們比100個高優先級郵件更可能影響電子郵件傳送。

0

我實際上實施了測試來測試DelayedJob處理髮送電子郵件。測試其實很簡單。

您應該排隊2個工作(而不是100個),一個具有高優先級,另一個具有較低優先級。然後您可以使用「Delayed :: Job.work_off」方法執行第一個作業,然後斷言較低優先級的作業仍在db等待中。如果您仍不確定如何執行工作,請查看圖書館。代碼寫得很好。

這裏是我的應用程序的代碼摘錄。基本上我需要發送提醒郵件給用戶,所以我需要確保這些工作正確執行,並且郵件不會被彈出。我把這個測試放到了reminder_test.rb單元測試文件中,因爲Reminder模型知道如何排隊和發送電子郵件。

# enqueue the jobs here 

assert_difference 'Delayed::Job.count', -1, 'Job should execute successfully' do 
    assert_difference 'ActionMailer::Base.deliveries.count' do 
    Delayed::Job.work_off 
    end 
end 

# make sure the email was properly delivered 
email = ActionMailer::Base.deliveries.last 
assert_equal email.to[0], @user.email 
assert (Time.now - @reminder.reload.sent_at) < 1.seconds 

乾杯!希望得到這個幫助

Alex