2015-11-29 7 views
5

Ich habe eine einfache CRUD-App mit Scala Play 2.4.3 und Play-slick 1.1.0(), die eine MySQL-Datenbank für persistenten Speicher verwendet.Testen Play + Slick App

Ich habe versucht, die Tests für meine Anwendung zu erstellen, und ich sah zwei Hauptoptionen:

  • Zugriff auf die Datenbank spöttisch, dass so weit wie ich, einige Code erfordert gesehen habe Änderungen
  • Tests machen verwenden eine alternative Datenbank (wahrscheinlich im Speicher H2).

Was ist der beste Ansatz (Vorteile und Desavantages)?

ziehe ich den zweiten Ansatz, aber ich habe einige Schwierigkeiten bei der Einrichtung, die Tests zu finden.

Was muss ich tun? Erstens glaube ich, dass ich die Tests mit einem FakeApplication laufen tun müssen, nicht wahr? Brauche ich irgendeine sbt-Abhängigkeit, um das zu können?

Danach, wie gebe ich die H2-Datenbank verwenden?

Antwort

3

Meine Lösung war step(Play.start(fakeApp)) am Anfang jeder Spezifikation und step(Play.stop(fakeApp)) am Ende jeder Spezifikation hinzuzufügen.

auch:

def fakeApp: FakeApplication = { 
FakeApplication(additionalConfiguration = 
    Map(
    "slick.dbs.default.driver" -> "slick.driver.H2Driver$", 
    "slick.dbs.default.db.driver" -> "org.h2.Driver", 
    "slick.dbs.default.db.url" -> "jdbc:h2:mem:play" 
)) 

}

Dies benötigt wurde, weil ich play-slick bin mit, die Konfigurationen wie erfordert:

slick.dbs.default.driver = "slick.driver.MySQLDriver$" 
slick.dbs.default.db.driver = "com.mysql.jdbc.Driver" 
slick.dbs.default.db.url = "jdbc:mysql://localhost/database" 
slick.dbs.default.db.user = "user" 
slick.dbs.default.db.password = "password" 

weitere Informationen über die docs

+1

Was ist dieser "Schritt"? Das Keyword ist nicht einfach zu suchen. – JulienD

+0

Höchstwahrscheinlich die Funktion von specs2, mit der Sie bestimmte Dinge vor und/oder nach Tests ausführen können. Ähnlich wie bei "VorherAll"/"AfterAll". – rethab

5

hatte ich den gleichen Kampf, und ich kam mit einer Lösung wie dieser nach oben (zweiter Ansatz):

erstellen einen Kontext für DAO zu verwenden:

trait BaseContext{ 

    def dbName: String 

    val dbConfig = DatabaseConfigProvider.get[JdbcProfile](dbName) 
    val db = dbConfig.db 
    val profile = dbConfig.driver 
    val tables = new Tables { // this is generated by Schema Code Generator 
    override val profile: JdbcProfile = dbConfig.driver 
    } 
} 

@Singleton 
class AppContext extends BaseContext{ 
    def dbName = "mysql" // name in your conf right after "slick.dbs" 
} 

@Singleton 
class TestingContext extends BaseContext{ 
    def dbName = "h2" 
} 

Dann erstellen Sie ein Modul die binden Injektion, und vergessen Sie nicht, es in conf ermöglichen play.modules.enabled += "your.Module" mit:

class ContextModule(environment: Environment, configuration: Configuration) extends AbstractModule { 

    override def configure(): Unit = { 
    if (configuration.getString("app.mode").contains("test")) { 
     bind(classOf[BaseContext]) 
      .to(classOf[TestingContext]) 
    } else { 
     bind(classOf[BaseContext]) 
      .to(classOf[AppContext]) 
    } 
    } 
} 

und es Sie erstellt haben zu jedem DAO injizieren:

class SomeDAO @Inject()(context: BaseContext){ 

    val dbConfig = context.dbConfig 
    val db = context.db 
    val tables = context.tables 
    import tables.profile.api._ 

    def otherStuff.... 
    // you can call db.run(...), tables.WhateverYourTableIs, tables.TableRowCaseClass, ... 
} 

und letzter Schritt der Konfigurationsdatei. In meinem Fall habe ich app.mode die Umwelt zu markieren, und ich verwende getrennt .conf für andere Umgebung. In diesen conf müssen Sie die richtige DB-Konfiguration haben. Hier ist das Beispiel:

Ich bin ziemlich sicher, dass meine Lösung nicht eine elegante ist, aber es liefert die Ware. :) Jede bessere Lösung ist willkommen!

+0

stellte sich heraus, Typesafe hat ein Projekt, das genau dies demonstriert. https: // GitHub.com/typesafehub/activator-slick-multidb –

+0

Ich bin mir dieses Beispiels bewusst und es gab mir einige Hinweise. Aber das hat meine Erwartungen nicht 100% erfüllt. – noru

+0

Was hast du vermisst? Im letzten Zweig, 3.1, haben sie das, was du oben gezeigt hast und dann einige. –