(我有多个相关的问题,所以我突出显示为粗体)
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
?