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]