使用 slick 和 scalatest 在 h2 数据库上断言唯一键约束
Assert unique key constraint on h2 database with slick and scalatest
想象一下以下场景:您有一本书,其中的章节按顺序排列。
首先是测试:
"Chapters" should "have a unique order" in
{
// val exception = intercept
db.run(
DBIO.seq
(
Chapters.add(0, 0, "Chapter #0"),
Chapters.add(0, 0, "Chapter #1")
)
)
}
现在实施:
case class Chapter(id: Option[Long] = None, bookId: Long, order: Long, val title: String) extends Model
class Chapters(tag: Tag) extends Table[Chapter](tag, "chapters")
{
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def bookId = column[Long]("book_id")
def order = column[Long]("order")
def title = column[String]("title")
def * = (id, bookId, order, title) <> (Chapter.tupled, Chapter.unapply)
def uniqueOrder = index("order_chapters", (bookId, order), unique = true)
def bookFK = foreignKey("book_fk", bookId, Books.all)(_.id.get, onUpdate = ForeignKeyAction.Cascade, onDelete = ForeignKeyAction.Restrict)
}
也许在 h2
中甚至不可能对 2 列进行这样的唯一约束?
无论如何:
期望:
抛出一个异常,然后我可以 intercept/expect 在我的测试中,因此目前测试失败,因为违反了唯一约束。
实际结果:
测试成功:(
编辑:另外,我用这个:
implicit val defaultPatience =
PatienceConfig(timeout = Span(30, Seconds), interval = Span(100, Millis))
db.run
returns一个Future
。
您必须对其进行 Await
才能获得执行结果。
试试这个:
import scala.concurrent.duration._
val future = db.run(...)
Await.result(future, 5 seconds)
想象一下以下场景:您有一本书,其中的章节按顺序排列。
首先是测试:
"Chapters" should "have a unique order" in
{
// val exception = intercept
db.run(
DBIO.seq
(
Chapters.add(0, 0, "Chapter #0"),
Chapters.add(0, 0, "Chapter #1")
)
)
}
现在实施:
case class Chapter(id: Option[Long] = None, bookId: Long, order: Long, val title: String) extends Model
class Chapters(tag: Tag) extends Table[Chapter](tag, "chapters")
{
def id = column[Option[Long]]("id", O.PrimaryKey, O.AutoInc)
def bookId = column[Long]("book_id")
def order = column[Long]("order")
def title = column[String]("title")
def * = (id, bookId, order, title) <> (Chapter.tupled, Chapter.unapply)
def uniqueOrder = index("order_chapters", (bookId, order), unique = true)
def bookFK = foreignKey("book_fk", bookId, Books.all)(_.id.get, onUpdate = ForeignKeyAction.Cascade, onDelete = ForeignKeyAction.Restrict)
}
也许在 h2
中甚至不可能对 2 列进行这样的唯一约束?
无论如何:
期望: 抛出一个异常,然后我可以 intercept/expect 在我的测试中,因此目前测试失败,因为违反了唯一约束。
实际结果: 测试成功:(
编辑:另外,我用这个:
implicit val defaultPatience =
PatienceConfig(timeout = Span(30, Seconds), interval = Span(100, Millis))
db.run
returns一个Future
。
您必须对其进行 Await
才能获得执行结果。
试试这个:
import scala.concurrent.duration._
val future = db.run(...)
Await.result(future, 5 seconds)