2016-03-29 3 views
5

Ich versuche, dem idiomatischen Weg zu folgen, ein paar vollständig getestete DAO-Dienste zu haben.Play Framework und Slick: Testen von Datenbank-bezogenen Diensten

Ich habe ein paar Fallklassen wie die bekam folgende:

case class Person (
    id  :Int, 
    firstName :String, 
    lastName :String 
) 

case class Car (
    id  :Int, 
    brand :String, 
    model :String 
) 

Dann habe ich eine einfache DAO Klasse wie folgt bekommen:

class ADao @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) extends HasDatabaseConfigProvider[JdbcProfile] { 
    import driver.api._ 

    private val persons = TableQuery[PersonTable] 
    private val cars = TableQuery[CarTable] 
    private val personCar = TableQuery[PersonCar] 

    class PersonTable(tag: Tag) extends Table[Person](tag, "person") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def firstName = column[String]("name") 
    def lastName = column[String]("description") 
    def * = (id, firstName, lastName) <> (Person.tupled, Person.unapply) 
    } 

    class CarTable(tag: Tag) extends Table[Car](tag, "car") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def brand = column[String]("brand") 
    def model = column[String]("model") 
    def * = (id, brand, model) <> (Car.tupled, Car.unapply) 
    } 

    // relationship 
    class PersonCar(tag: Tag) extends Table[(Int, Int)](tag, "person_car") { 
    def carId = column[Int]("c_id") 
    def personId = column[Int]("p_id") 
    def * = (carId, personId) 
    } 

    // simple function that I want to test 
    def getAll(): Future[Seq[((Person, (Int, Int)), Car)]] = db.run(
    persons 
     .join(personCar).on(_.id === _.personId) 
     .join(cars).on(_._2.carId === _.id) 
     .result 
) 
} 

Und mein application.conf sieht aus wie :

slick.dbs.default.driver="slick.driver.PostgresDriver$" 
slick.dbs.default.db.driver="org.postgresql.Driver" 
slick.dbs.default.db.url="jdbc:postgresql://super-secrete-prod-host/my-awesome-db" 
slick.dbs.default.db.user="myself" 
slick.dbs.default.db.password="yolo" 

Nun, indem sie durch Testing with databases gehen und versuchen zu imitieren play-slick sample project Ich bekomme so viele Probleme und ich kann nicht verstehen, wie ich meinen Test eine andere Datenbank benutzen lassen kann (ich muss wohl eine andere db auf meiner conf-Datei hinzufügen, sagen wir slick.dbs.test), aber dann konnte ich es nicht herausfinden wie man das in den Test injiziert.

Auch auf der Probe Repo gibt es einige "Magie" wie Application.instanceCache[CatDAO] oder app2dao(app).

Kann mir jemand auf ein vollwertiges Beispiel von oder Repo zeigen, die richtig mit Testspielen und Slick behandelt?

Danke.

Antwort

4

Ich stimme zu, es ist verwirrend. Ich weiß nicht, ob dies die beste Lösung ist, aber ich am Ende eine separate Konfigurationsdatei mit test.conf, die eine In-Memory-Datenbank spezifiziert:

slick.dbs { 
    default { 
    driver = "slick.driver.H2Driver$" 
    db.driver = "org.h2.Driver" 
    db.url = "jdbc:h2:mem:play-test" 
    } 
} 

und sagte dann sbt dies zu verwenden, wenn die Tests ausgeführt werden:

[..] javaOptions in Test ++= Seq("-Dconfig.file=conf/test.conf")