【问题标题】:Play Framework and Slick: testing database-related servicesPlay Framework 和 Slick:测试数据库相关服务
【发布时间】:2016-03-29 17:48:11
【问题描述】:

我正在尝试遵循最惯用的方式来拥有一些经过全面测试的 DAO 服务。

我有一些案例类,如下所示:

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)

任何人都可以指出一些完整的示例或 repo 以正确处理测试游戏和 slick 吗?

谢谢。

【问题讨论】:

    标签: scala testing playframework slick specs2


    【解决方案1】:

    我同意这令人困惑。我不知道这是否是最好的解决方案,但我最终得到了一个单独的配置文件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")
    

    【讨论】:

      猜你喜欢
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多