代码之家  ›  专栏  ›  技术社区  ›  yiksanchan

无法在内存数据库h2上运行测试,而是在PostgreSQL上运行

  •  0
  • yiksanchan  · 技术社区  · 6 年前

    (我有多个相关的问题,所以我突出显示为粗体)

    play app .

    • 氢气:1.4.197
    • postgresql:42.2.5版本
    • 玩滑头/玩滑头进化:3.0.1
    • 光滑pg:0.16.3

    我正在为DAO添加一个测试,我认为它应该在h2内存数据库上运行,该数据库在测试开始时创建,在测试结束时清除。

    # application.conf
    slick.dbs.default.profile="slick.jdbc.PostgresProfile$"
    slick.dbs.default.db.driver="org.postgresql.Driver"
    slick.dbs.default.db.url="jdbc:postgresql://localhost:5432/postgres"
    

    这是我的测试 test/dao/TodoDAOImplSpec.scala

    package dao
    
    import play.api.inject.guice.GuiceApplicationBuilder
    import play.api.test.{Injecting, PlaySpecification, WithApplication}
    
    class TodoDAOImplSpec extends PlaySpecification {
      val conf = Map(
        "slick.dbs.test.profile" -> "slick.jdbc.H2Profile$",
        "slick.dbs.test.db.driver" -> "org.h2.Driver",
        "slick.dbs.test.db.url" -> "jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=FALSE"
      )
      val fakeApp = new GuiceApplicationBuilder().configure(conf).build()
      //val fakeApp = new GuiceApplicationBuilder().configure(inMemoryDatabase()).build()
      //val fakeApp = new GuiceApplicationBuilder().configure(inMemoryDatabase("test")).build()
      "TodoDAO" should {
        "returns current state in local pgsql table" in new WithApplication(fakeApp) with Injecting {
          val todoDao = inject[TodoDAOImpl]
          val result = await(todoDao.index())
          result.size should_== 0
        }
      }
    }
    

    为了 fakeApp

    我的尝试/发现:

    第一, inMemoryDatabase() Map("db.<name>.driver"->"org.h2.Driver", "db.<name>.url"->""jdbc:h2:mem:play-test-xxx") ,看起来和我的很像 conf 地图。但是,有两个主要区别:

    • inMemoryDatabase 使用 db.<name>.xxx 而我的 形态 地图用途 slick.dbs.<name>.db.xxx .

    第二,改名 映射到“slick.dbs.default.profile”、“slick.dbs.default.db.driver”和“slick.dbs.default.db.url”的键将抛出错误。

    [error] p.a.d.e.DefaultEvolutionsApi - Unknown data type: "status_enum"; SQL statement:
    ALTER TABLE todo ADD COLUMN status status_enum NOT NULL [50004-197] [ERROR:50004, SQLSTATE:HY004]
    
    cannot create an instance for class dao.TodoDAOImplSpec
    
      caused by @79bg46315: Database 'default' is in an inconsistent state!
    

    slick-pg ? (看到了吗 slick-pg issue with h2 ). 这是否意味着这是运行h2内存测试的正确配置? 如果是这样,问题就变成了 How to fake PostgreSQL ENUM in h2

    this thread ,运行 sbt '; set javaOptions += "-Dconfig.file=conf/application-test.conf"; test' 使用测试配置文件 conf/application-test.conf

    include "application.conf"
    
    slick.dbs.default.profile="slick.jdbc.H2Profile$"
    slick.dbs.default.db.driver="org.h2.Driver"
    slick.dbs.default.db.url="jdbc:h2:mem:test;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=FALSE"
    

    毫不奇怪,我得到了与第二次试验相同的错误。

    在我看来,第二次和第三次审判指向了正确的方向(将在这方面的工作)。 但我们为什么要 name default ?

    1 回复  |  直到 6 年前
        1
  •  0
  •   o-0    6 年前

    在播放中,默认数据库是 违约 comment 具有 user

    CREATE TABLE comment.User(
    id                      int(250)         NOT NULL AUTO_INCREMENT,
    username                varchar(255), 
    comment                 varchar(255), 
    PRIMARY KEY             (id)); 
    

    然后我需要它的配置来连接到它(将它添加到 application.conf

    db.comment.url="jdbc:mysql://localhost/comment"
    db.comment.username=admin-username
    db.comment.password="admin-password"
    

    你可以拥有 test

    本地数据库测试 :为什么不像在生产中那样在本地使用数据库?数据不存在,在本地运行测试不接触生产数据库;为什么需要一个额外的数据库?

    不一致状态 :这是当您编写的MYSQL更改数据库中当前数据库的状态时,可能是基于创建新表或您要删除它时。

    阿尔索 status_enum