2012-05-25 9 views
6

Esto es para jugar! Framework 2.0.Usando specs2 y FakeApplication() para probar la base de datos falla la evolución inserta

Estoy tratando de escribir un caso de prueba simple para asegurar que mi modelo de usuario funciona correctamente y los datos persistentes en mi base de datos. Me gustaría ejecutarlo en la memoria si es posible para poder comenzar de nuevo con cada nueva ejecución.

El problema que tengo es que mi evolución se ejecuta (se crean tablas, se insertan datos, pero no puedo consultarlo como si estuvieran allí). Primero, mi código.

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', '[email protected]', '12345678', 0, 0, true); 

En application.conf

db.default.driver=org.postgresql.Driver 
db.default.url="postgres://user:[email protected]:5432/ME" 

En build.scala

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

El código de prueba

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 protected]") must beEqualTo(1) 
     User_data.create("user2", "password2", "[email protected]") must beEqualTo(2) 
     User_data.create("user1", "password3", "[email protected]") 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 protected]") 
     user.get.password must beEqualTo("password1") 
     user.get.edits must beEqualTo(0) 
     user.get.reports must beEqualTo(0) 
     user.get.active must beTrue 
     } 
    } 
    } 
} 

Este código pasará como está escrito, sin embargo, shouldn' t. Si elimino el comentario del primer caso de prueba dentro del bloque en ejecución para probar que mi función findAll() debe tener una longitud de 1, fallará inmediatamente. Sin embargo, si cambio esto para usar una base de datos PostgreSQL persistente en mi máquina, aún fallará inmediatamente, pero cuando miro la base de datos PostgreSQL, mi tabla user_data tiene insertada la evolución única insertada en ella, y la tabla play_evolutions tiene la entrada para mi evolución y se marca como estado = "aplicado" y último problema = "".

Cualquier ayuda sería apreciada, gracias.

(PS, soy un primer cartel tiempo, pero haré todo lo posible para aceptar una respuesta tan pronto como sea posible para quienes están dispuestos a prestar su ayuda)

Respuesta

3

* ACTUALIZADO *

Como Jakob establecido, la razón por la cual las evoluciones están fallando es probablemente porque el SQL escrito para MySQL es incompatible con H2DB. Puede resolver esto utilizando un MySQL por separado para probar según la respuesta original, o ponga H2DB en el modo de compatibilidad MySQL que puede solucionar el problema (consulte Fixtures in Play! 2 for Scala).

+0

Lo siento, me perdí tu respuesta cuando lo hiciste, pero gracias! –

+0

np, gracias por mi primera respuesta aceptada! – jazmit

+0

Eso no tiene ningún sentido. Si especifica otro nombre para la base de datos en memoria, entonces las solicitudes de conexión también deberían extenderse con ese nombre. Además de eso, necesitarías una entrada db.test en tu configuración. Si no sigue estos pasos, simplemente usará la base de datos 'predeterminada' de todos modos. Tal vez me perdí algo. – EECOLOR

0
+0

Todd, No uso Play actualmente ya que estaba ejecutando demasiados errores y/o comportamientos no documentados para el proyecto rápido en el que estaba trabajando. No estoy seguro si puedo transferirle una pregunta o permitirle que elija la respuesta correcta, pero me complace dejar que se haga cargo de esta pregunta de alguna manera si siente que mi respuesta aceptada ya no es precisa. –

+0

Gracias, William Thurston. Estaba pensando en publicar una nueva pregunta, pero primero quiero probar esto en la última versión candidata para jugar con framework 2.1. –

+0

... Todavía no me he actualizado para jugar 2.1. No es una migración trivial, y hay elementos más urgentes en mi backlog. –

0

El problema con evoluciones y H2 H2 es que no es compatible con todo lo que puede hacer con Postgres o MySQL, por ejemplo. Entonces las evoluciones correrán bien en prod, pero no en la prueba. Tuve este problema en un proyecto y eventualmente lo resolví simplemente sin usar evoluciones y en su lugar utilicé liquibase para las cosas de DB.

O uno necesita asegurarse de que el SQL que escribe se puede ejecutar en H2. En ese caso, las evoluciones funcionarán bien. No recuerdo exactamente cuál era el problema con H2 (algo sobre los índices, creo)

Cuestiones relacionadas