2016-03-29 49 views
5

Staram się postępować zgodnie z najbardziej idiotycznym sposobem posiadania kilku w pełni przetestowanych usług DAO.Play Framework and Slick: testowanie usług związanych z bazą danych

Mam kilka klas przypadku takim jak:

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

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

Wtedy mam prostą klasę DAO tak:

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 
) 
} 

A moja application.conf wygląda :

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" 

teraz przechodząc przez Testing with databases i próbuje naśladować play-slick sample project Mam kłopoty i nie mogę zrozumieć, jak sprawić, by mój test korzystał z innej bazy danych (przypuszczam, że muszę dodać inną db na moim pliku conf, na przykład slick.dbs.test), ale wtedy nie mogłem się dowiedzieć jak wstrzyknąć to w teście.

Ponadto, na próbie repo, istnieje pewna "magia" jak Application.instanceCache[CatDAO] lub app2dao(app).

Czy ktoś może wskazać mi jakiś przykład lub repo, który zajmuje się testowaniem gry i zręczności?

Dzięki.

Odpowiedz

4

Zgadzam się, że to jest mylące. Nie wiem, czy jest to najlepsze rozwiązanie, ale skończyło się na osobny plik konfiguracyjny test.conf która określa bazę danych w pamięci:

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

a następnie powiedział SBT użyć to podczas uruchamiania testów:

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