starter play framework scala playframework playframework-2.0 slick

starter - scala play framework sbt



Play Slick: cómo inyectar DbConfigProvider en las pruebas (1)

Estoy usando Play 2.5.10, Play-slick 2.0.2, y mi proyecto generado por activador viene con Scalatest y un código como este:

class TestSpec extends PlaySpec with OneAppPerSuite {...}

Logré probar rutas / acciones; ahora probaría métodos DAO en un nivel inferior. Busqué en la web y SO una solución, y no pude encontrar ninguna que esté actualizada. Una firma DAO es así:

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

así que necesito pasarlo por el elemento dbConfigProvider . Por alguna razón, no puedo inyectar el proveedor en las pruebas como lo hacemos en los controladores (no hay error, las pruebas simplemente no se ejecutarán):

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

Los documentos Play-Slick dicen que alternativamente podemos usar una búsqueda global

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

pero no funcionará directamente porque

No hay una aplicación iniciada

y enlace a un proyecto de ejemplo que hace eso:

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

pero nunca pude encontrar el WithApplicationLoader . En cambio, parece haber una aplicación con WithApplication :

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

pero luego me sale

No coinciden los tipos: se esperaba una aplicación play.api., got: play.Application.

En este punto, perdí la esperanza.

¿Cómo puedo probar un DAO?

NB No necesito cambiar las bases de datos para probarlas (lo manejo a través de config), solo quiero acceder a la base de datos predeterminada en las pruebas.


Puedes usar:

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