2016-03-21 2 views
1

Stellen Sie sich folgendes Szenario vor: Sie haben ein Buch, das von geordneten Kapiteln besteht.Assert einzigartige Schlüsseleinschränkung für h2 Datenbank mit Slick und scalatest

Zuerst wird der Test:

"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") 
    ) 
    ) 
} 

Nun ist die Implementierung:

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) 
} 

Vielleicht so eine einzigartige-Einschränkung für 2 Spalten ist nicht einmal möglich, in h2?

Wie der auch wäre:

Erwartung: Eine Ausnahme geworfen werden, dass ich dann in meinem Test abfangen/erwarten, damit eine fehlerhafte Prüfung für jetzt, für einen eindeutigen Zwang zu verletzen.

Tatsächliches Ergebnis: Ein erfolgreicher Test :(

bearbeiten: Auch ich benutze diese:.

implicit val defaultPatience = PatienceConfig(timeout = Span(30, Seconds), interval = Span(100, Millis))

+0

Können Sie nicht das generierte Schema sehen? Schauen Sie sich die Tabellendefinition innerhalb h2 selbst – nmat

Antwort

2

db.run gibt ein Future Sie haben darauf zu Await um das Ergebnis der Ausführung zu erhalten Versuchen Sie Folgendes:

import scala.concurrent.duration._ 
val future = db.run(...) 
Await.result(future, 5 seconds) 
+0

Ich sollte wohl das erwähnt habe: 'implizite val defaultPatience = PatienceConfig (timeout = Span (30, Sekunden), Intervall = Span (100, Millis))' – Sorona

+1

Ich sehe nicht, wie es ist wichtig für alles – Dima

+0

Ich habe nie gewartet in meinen Tests und immer eine Standard-Geduld. http://www.artima.com/docs-scalatest-2.0.M5/org/scalatest/concurrent/PatienceConfiguration.html – Sorona