Scala 使用specs2和FakeApplication()测试数据库失败

Scala 使用specs2和FakeApplication()测试数据库失败,scala,testing,playframework,playframework-2.0,specs2,Scala,Testing,Playframework,Playframework 2.0,Specs2,这是玩的!框架2.0 我正在尝试编写一个简单的测试用例,以确保我的用户模型正常运行,并将数据持久化到数据库中。如果可能的话,我想在内存中运行它,这样我就可以在每次新的运行中重新开始 我所面临的问题是,我的演进正在运行(创建了表,插入了数据,但我无法查询它是否存在)。首先,我的代码 CREATE TABLE user_data ( id SERIAL PRIMARY KEY, user_name varchar(256) UNIQUE NOT NULL, email varchar(256) NO

这是玩的!框架2.0

我正在尝试编写一个简单的测试用例,以确保我的用户模型正常运行,并将数据持久化到数据库中。如果可能的话,我想在内存中运行它,这样我就可以在每次新的运行中重新开始

我所面临的问题是,我的演进正在运行(创建了表,插入了数据,但我无法查询它是否存在)。首先,我的代码

CREATE TABLE user_data (
id SERIAL PRIMARY KEY,
user_name varchar(256) UNIQUE NOT NULL,
email varchar(256) NOT NULL,
password varchar(256) NOT NULL,
edits int NOT NULL,
reports int NOT NULL,
active BOOLEAN NOT NULL);

INSERT INTO user_data(user_name, email, password, edits, reports, active) VALUES ('user1', 'user1@email.com', '12345678', 0, 0, true);
在application.conf中

db.default.driver=org.postgresql.Driver
db.default.url="postgres://user:password@localhost:5432/ME"
In build.scala

val appDependencies = Seq(
  // Add your project dependencies here,
    "postgresql" % "postgresql" % "9.1-901-1.jdbc4"
)
测试代码

class User_dataSpec extends Specification {

  "The Database" should {
    "persist data properly" in {
  running(FakeApplication(additionalConfiguration = inMemoryDatabase())) {

      //User_data.findAll().length must beEqualTo(1)
      //Create users
      User_data.create("user1", "password1", "email@test1.com") must beEqualTo(1)
      User_data.create("user2", "password2", "email@test2.com") must beEqualTo(2)
      User_data.create("user1", "password3", "email@test3.com") must beEqualTo(0)

      //Count users
      User_data.findAll().length must beEqualTo(2)

      //Verify users exist
      User_data.exists("user1") must beTrue
      User_data.exists("user2") must beTrue

      //Verify user doesn't exist
      User_data.exists("user3") must beFalse

      //Find users by ID
      User_data.findUser(1).get.user_name must beEqualTo("user1")
      User_data.findUser(2).get.user_name must beEqualTo("user2")

      //Fail to find users by ID
      User_data.findUser(3) must beNone

      //Find users by user_name
      User_data.findUser("user1").get.user_name must beEqualTo("user1")
      User_data.findUser("user2").get.user_name must beEqualTo("user2")

      //Fail to find users by user_name
      User_data.findUser("user3") must beNone

      //Authenticate users
      User_data.authenticate("user1", "password1") must beTrue
      User_data.authenticate("user2", "password2") must beTrue

      //Fail to authenticate users
      User_data.authenticate("user1", "password2") must beFalse
      User_data.authenticate("user3", "passwordX") must beFalse

      //Confirm the user was inserted properly
      val user = User_data.findUser("user1")
      user.get.user_name must beEqualTo("user1")
      user.get.email must beEqualTo("email@test1.com")
      user.get.password must beEqualTo("password1")
      user.get.edits must beEqualTo(0)
      user.get.reports must beEqualTo(0)
      user.get.active must beTrue
      }
    }
  }
}
这段代码将以书面形式通过,但不应该。如果我取消对正在运行的块中的第一个测试用例的注释,以测试findAll()函数的长度是否应为1,它将立即失败。但是,如果我将其更改为在我的计算机上使用持久化的PostgreSQL DB,它仍然会立即失败,但是当我查看PostgreSQL DB时,我的用户数据表中有一个应用的演化插入,play_evolutions表有我的演化条目,并标记为state=“applicated”和last problem=“”

任何帮助都将不胜感激,谢谢


(顺便说一句,我是第一次登上海报,但我会尽我所能尽快为那些愿意提供帮助的人接受答案)

*更新*


正如Jakob所说,演进失败的原因可能是因为为MySQL编写的SQL与H2DB不兼容。您可以根据原始答案使用单独的MySQL进行测试来解决此问题,或者将H2DB置于MySQL兼容模式,这可能会解决此问题(请参阅)。

我认为这是play framework 2.0中的一个bug


进化和H2的问题在于,H2不符合您可以对postgres或MySQL执行的所有操作。所以进化在产品中运行良好,但在测试中失败。我在一个项目中遇到了这个问题,并最终通过简单地不使用evolutions而使用liquibase来解决它


或者需要确保您编写的sql可以在H2上运行。在这种情况下,进化将起到很好的作用。我记不清H2到底有什么问题(我想是关于索引的问题)

那没有任何意义。如果为内存中的数据库指定另一个名称,则连接请求也应使用该名称扩展。除此之外,在配置中还需要一个db.test条目。如果您不采取这些步骤,您将只使用“默认”数据库。也许我错过了什么。我想这里出了点问题——我得到的结果和EECOLOR担心的一样。我的测试使用的是默认数据库,而不是内存中的新数据库……如果我从inMemoryDatabase()中删除“test”参数,那么测试将与H2相反,但演化没有运行。将我的默认数据库设置为H2(evolution不运行)也是如此。evolutions不在内存中运行的原因可能是evolutions文件中的SQL不符合H2。只是因为所有SQL在MySQL中都有效并不意味着它在H2中有效。我建议使用liquibase而不是evolutions…还要注意在模型中使用与SQL冲突的成员名称,例如,如果有名为“group”、“order”等的成员,则测试中的evolutions会失败。Todd,我目前不使用Play,因为我在从事quick项目时遇到了太多的bug和/或未记录的行为。我不确定是否可以将问题转给您,或者允许您选择正确的公认答案,但如果您觉得我公认的答案不再准确,我很高兴让您以某种方式接管这个问题。谢谢,威廉·瑟斯顿。我想发布一个新问题,但首先我想在play framework 2.1的最新候选版本上尝试一下……我还没有升级到play 2.1。这不是一个简单的迁移,在我的待办事项中还有更紧迫的事项。