2017-02-03 11 views
2

Я использую Play 2.5.10, Play-скользкий 2.0.2, и мой активатор сгенерированных проект поставляется с scalatest и такой код:Play Slick: Как придать DbConfigProvider в тестах

class TestSpec extends PlaySpec with OneAppPerSuite {...} 

мне удалось проверять маршруты/действия; теперь я бы тест DAO методы на более низком уровне. Я искал в Интернете и SO для решения, и не мог найти то, что все еще актуально. DAO подпись, как это:

class TestDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] 

так что мне нужно, чтобы передать ему dbConfigProvider вещь. По некоторым причинам я не могу вводить поставщика в тестах, как мы делаем в контроллерах (без ошибок, тесты просто не будет работать):

class TestSpec @Inject()(dbConfigProvider: DatabaseConfigProvider) extends PlaySpec with OneAppPerSuite {...} 

Play-Slick docs говорят, что мы можем в качестве альтернативы использовать глобальный поиск

val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current) 

, но он не будет работать напрямую, потому что

Там не запущенное приложение

и ссылку на примере проекта делать это:

class TestDAOSpec extends Specification { 
    "TestDAO" should { 
    "work as expected" in new WithApplicationLoader { // implicit 'app' 
     val app2dao = Application.instanceCache[TestDAO].apply(app) 

, но я никогда не мог найти WithApplicationLoader. Вместо этого, кажется WithApplication:

class TestDAOSpec extends Specification { 
    "TestDAO" should { 
    "work as expected" in new WithApplication() { // implicit 'app' 
     val app2dao = Application.instanceCache[TestDAO].apply(app) 

, но затем я получаю

Несоответствие типа: ожидали play.api.Application, получил: play.Application.

На данный момент я потерял надежду.

Как проверить DAO?

N.B. Мне не нужно переключать базы данных для тестирования (я обрабатываю это через config), я просто хочу получить доступ к базе данных по умолчанию в тестах.

+1

Вам просто нужно приложение в объеме, так смешайте в 'OneAppPerSuite' или' OneAppPerTest'. См. [Здесь] (https://github.com/sake92/PlayGuiceExample/blob/master/test/dao/PersonDAOImplSpec.scala#L17). –

+0

Я делаю 'с OneAppPerSuite', но я получаю это. Одно из решений, которое я нашел, это «import play.api.Play.current» в версии «WithApplication()», то он работает, но я получаю предупреждение об устаревании. – JulienD

+0

Он работал с этим примером, спасибо большое. Я переусердствовал «PlaySpec», чтобы включить весь этот таинственный беспорядок. Я совершенно отвратился от того, как это так невероятно сложно. Переопределите неявное приложение, которое происходит из ниоткуда, 'GuiceApplicationBuilder', повторите conf, который у вас уже есть в вашей конфигурации, без видимых причин,' instanceCache', whaaat ?? И если я могу скопировать и вставить, что после sooo много часов пробовал все остальное, почему это еще не в рамках ??? – JulienD

ответ

2

Вы можете использовать:

lazy val appBuilder: GuiceApplicationBuilder = new GuiceApplicationBuilder().in(Mode.Test) 
lazy val injector: Injector = appBuilder.injector() 
lazy val dbConfProvider: DatabaseConfigProvider = injector.instanceOf[DatabaseConfigProvider] 
+0

Он работает и отвечает на вопрос напрямую.Для других зрителей это нужно вставить в расширение «PlaySpec», как в этом примере https://github.com/sake92/PlayGuiceExample/blob/master/test/dao/PersonDAOImplSpec.scala#L17. 'DatabaseConfigProvider.get [JdbcProfile] (приложение)' также работает теперь, когда я знаю, как получить мое неявное 'приложение'. Но эти несколько строк заставили меня понять многое, спасибо. – JulienD