(我有多个相关问题,所以我将其突出显示为粗体)
我有一个play app。
我正在为DAO添加一个测试,我相信它应该在h2内存数据库中运行,该数据库在测试开始时创建,并在测试结束时清除。
但是,我的测试始终在我配置和使用的PostgreSQL数据库上运行。
# 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
,我尝试了全部三个,但是它们都没有按预期方式工作-我的测试仍在我的本地PostgreSQL表(其中有3个待办事项)上运行,因此测试失败。
我尝试过/发现的东西:
首先,inMemoryDatabase()
仅返回一个Map("db.<name>.driver"->"org.h2.Driver", "db.<name>.url"->""jdbc:h2:mem:play-test-xxx")
,看起来与我自己的conf
地图非常相似。但是,有两个主要区别:
inMemoryDatabase
使用db.<name>.xxx
,而我的conf
地图使用slick.dbs.<name>.db.xxx
。 哪个应该是正确的? 第二,将conf
映射的键重命名为“ 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!
这个发现很有趣-与我对PostgreSQL ENUM类型和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
?还有其他更好的方法吗?
答案 0 :(得分:0)
在游戏中,默认数据库为默认。但是,您可以将其更改为所需的任何其他数据库名称,但是随后还需要添加数据库名称。例如,我想拥有一个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
也无法识别为MySQL命令。如果不确定,请尝试在MySQL控制台中使用要使用的命令。