2017-02-03 43 views
1

在試圖寫的測試我從玩這樣的警告:玩:如何用DI取代`Play.current`?

您不必範圍隱式應用。如果您想將當前運行的應用程序置於上下文中,請使用依賴注入。

我發現,如果我添加此導入,它神奇解決範圍的應用程序的問題:不過它警告你

import play.api.Play.current 

,在

方法電流對象Play不推薦使用:這是對應用程序的靜態引用,請使用DI代替

如何使用依賴注入來獲得相同的結果?這就是我需要它:

class TestSpec extends PlaySpec with OneAppPerSuite { ... } 

編輯:我沒有找到this post,我不看答案如何能夠給我一個線索對得到一個隱含Application

+0

重複關閉很多取決於你想使用哪個DI – Mysterion

+1

我想這是Guice,如果這是有道理的。它應該作爲一個依賴插入等價於'Play.current'全局插入的內容。 – JulienD

+0

你需要什麼來自'current'? – michaJlS

回答

0

我被指向this example(by @ insan-e),它顯示瞭如何解決這個問題。你不能注入的測試類,但你「只」需要重寫你的PlaySpec這個:

import javax.inject.{Inject, Singleton} 
import org.scalatestplus.play.{OneAppPerSuite, PlaySpec} 
import play.api.Application 
import play.api.inject.guice.GuiceApplicationBuilder 

// To avoid repeating the `instanceCache` line below for each DAO 
@Singleton 
class DaoContext @Inject()(
         val testDAO: TestDAO 
         // Other DAOs here 
) 

abstract class BetterSpec extends PlaySpec with OneAppPerSuite { 
    implicit override lazy val app = new GuiceApplicationBuilder().configure(...).build 

    protected def daoContext(implicit app: Application): DaoContext = { 
    Application.instanceCache[DaoContext].apply(app) 
    } 
} 

和測試:

class TestSpec extends BetterSpec { 
    "Test DAO" should { 
    "work" in { 
     val dao = daoContext.testDAO 
     // test it, finally 
    } 
    } 
} 

我知道,「什麼是地獄??? ?」但它的工作。

N.B.現在它可以作爲Play Slick: How to inject DbConfigProvider in tests