2017-02-03 3 views
1

私はプレイからこの警告を取得するテストを記述しようとしている間:再生: `Play.current`をDIで置き換えるには?

をあなたはスコープ内の暗黙的なアプリケーションを持っていません。現在実行中のアプリケーションをコンテキストに持っていきたい場合は、依存関係注入を使用してください。

私は、このインポートを追加する場合、それは魔法のスコープでのアプリケーションの問題を解決ことが判明:

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

「現在」から正確に何が必要ですか? – 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の複製として閉じられることができます

関連する問題