2016-03-29 13 views
5

Tôi đang cố gắng làm theo một cách thành ngữ nhất để có một vài dịch vụ DAO được kiểm tra đầy đủ.Play Framework and Slick: kiểm tra các dịch vụ liên quan đến cơ sở dữ liệu

Tôi đã có một vài lớp học trường hợp như sau:

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

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

Sau đó, tôi đã có một lớp DAO đơn giản như thế này:

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

Và application.conf của tôi trông giống như :

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" 

Bây giờ bằng cách đi qua Testing with databases và cố gắng bắt chước play-slick sample project Tôi đang gặp rất nhiều rắc rối và dường như tôi không hiểu làm thế nào để làm cho bài kiểm tra của tôi sử dụng một cơ sở dữ liệu khác (tôi cho rằng tôi cần phải thêm một db khác vào tệp conf của tôi, nói slick.dbs.test) làm thế nào để tiêm mà bên trong thử nghiệm.

Ngoài ra, trên mẫu repo, có một số "ma thuật" như Application.instanceCache[CatDAO] hoặc app2dao(app).

Ai có thể chỉ cho tôi một số ví dụ chính thức về hoặc repo giao dịch chính xác với thử nghiệm chơi và bóng bẩy?

Cảm ơn.

Trả lời

4

Tôi đồng ý rằng điều đó gây nhầm lẫn. Tôi không biết nếu điều này là giải pháp tốt nhất, nhưng tôi đã kết thúc có một tập tin cấu hình riêng biệt test.conf mà xác định một cơ sở dữ liệu trong bộ nhớ:

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

và sau đó nói với SBT sử dụng điều này khi chạy các bài kiểm tra:

[..] javaOptions in Test ++= Seq("-Dconfig.file=conf/test.conf") 
Các vấn đề liên quan