2016-03-29 46 views
5

我試圖按照最常用的方式來進行一些完全測試的DAO服務。Play框架和Slick:測試數據庫相關服務

我有幾類情況,如下列:

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

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

然後我有一個簡單的DAO類是這樣的:

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

而且我application.conf樣子:

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" 

現在通過Testing with databases去,並試圖模仿play-slick sample project 我進入這麼多麻煩,我似乎無法理解如何使我的測試使用不同的數據庫(我想我需要添加一個不同的數據庫在我的conf文件,說slick.dbs.test),但後來我找不到如何在測試中注入。

此外,在樣本回購中,有一些「魔術」,如Application.instanceCache[CatDAO]app2dao(app)

任何人都可以指出我的一些完整的例子或回購,正確地處理測試遊戲和浮油?

謝謝。

回答

4

我同意它很混亂。我不知道這是不是最好的解決辦法,但我最終有一個單獨的配置文件test.conf指定的內存數據庫:

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

然後告訴SBT使用這個運行測試時:

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