I would like to manually run my evolution script at the beginning of each test file. I'm working with Play! 2.4 and Slick 3.
According to the documentation, the way to go seems to be:
Evolutions.applyEvolutions(database)
but I don't manage to get an instance of my database. In the documentation play.api.db.Databases
is imported in order to get a database instance but if I try to import it, I get this error: object Databases is not a member of package play.api.db
How can I get an instance of my database in order to run the evolution script?
Edit: as asked in the comments, here is the entire source code giving the error:
import models._
import org.scalatest.concurrent.ScalaFutures._
import org.scalatest.time.{Seconds, Span}
import org.scalatestplus.play._
import play.api.db.evolutions.Evolutions
import play.api.db.Databases
class TestAddressModel extends PlaySpec with OneAppPerSuite {
lazy val appBuilder = new GuiceApplicationBuilder()
lazy val injector = appBuilder.injector()
lazy val dbConfProvider = injector.instanceOf[DatabaseConfigProvider]
def beforeAll() = {
//val database: Database = ???
//Evolutions.applyEvolutions(database)
}
"test" must {
"test" in { }
}
}
I finally found this solution. I inject with Guice:
(You have to import
play.api.db.DBApi
.)And in my tests, I simply do the following (actually I use an other database for my tests):
Use FakeApplication to read your DB configuration and provide a DB instance.
Use it like this:
To have access to
play.api.db.Databases
, you must add jdbc to your dependencies :Hope it helps some people passing here.
EDIT: the code would then look like this :
You now have an instance of the DB, and can execute queries on it :
You can see more from the docs
EDIT: typo
Considering that you are using Play 2.4, where evolutions were moved into a separate module, you have to add
evolutions
to your project dependencies.I find the easiest way to run tests with evolutions applied is to use
FakeApplication
, and input the connection info for the DB manually.Use it like this:
This allows you, for example, to use an in-memory database for speeding up your unit tests.
You can access the DB instance as
play.api.db.DB
if you need it. You'll also need toimport play.api.Play.current
.