2016-01-08 25 views
0

我有一個Scala Play應用程序,其中一個控制器觸發一個記錄日誌的Future。我有一個簡單的回調函數,它在未來完成時執行。在做出斷言之前等待未來完成

我已經寫了一個測試來檢查這個日誌記錄是否發生。粗略邏輯如下:

feature{ 

    scenario{ 
    Given() 
     // set up the call 
    When() 
     // make a FakeRequest via reverse routing - logging will done in a separate thread via a Future 
    Then() 
     Thread.sleep(50) // sleep to allow logging to finish 
     // check if the logging has been done 

問題是Thread.sleep。我已經添加了這個調用來阻止主測試線程,以便爲Future提供足夠的時間,這樣Future就可以在單獨的線程中完成日誌記錄,然後再實際執行檢查以查看日誌記錄是否已完成。

我的問題是是否有更好的方法來做到這一點?實際上,如果我的應用程序正在運行並且日誌記錄花費了過多的時間,那麼控制應用程序的主線程將不會終止,直到在獨立線程中完成日誌記錄的Future完成。所以我沒有看到上面的Thread調用來模擬這個問題。但我只想確認這是否正確。

對我來說,絕對沒有別的方法可以做到這一點。如果我嘗試複製應用程序在我的測試中的現實行爲,那麼即使測井的未來仍在進行,測試的主線程應該完成並終止;在測試中沒有回電,也不應該有回電。

+0

我放棄了我的答案。考慮到你如何評論它,我建議:或者在測試中使鏈接可用,或者更新關於未來結果的某個全局變量(例如發佈的日誌消息量)。 – Rumoku

+0

你可以使用[CallingThreadDispatcher](http://doc.akka.io/docs/akka/snapshot/scala/testing.html#scala-callingthreaddispatcher)使你的測試同步嗎? – jkinkead

+0

@jkinkead,使測試同步不會複製應用程序的行爲(這是異步的)。對我來說,測試不應該偏離應用程序在現實中的行爲方式。 –

回答

相關問題